-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRepositoryBase.cs
More file actions
131 lines (116 loc) · 4.12 KB
/
RepositoryBase.cs
File metadata and controls
131 lines (116 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Threading;
using System.Threading.Tasks;
namespace Tao.Repository
{
public class RepositoryBase
{
private ParserFactory parserFactory;
public RepositoryBase()
{
this.parserFactory = new ParserFactory();
}
protected IEnumerable<T> Get<T>(
IDbConnection connection,
IDbCommand command,
Func<IDataRecord, T> projector,
IList<IDataParameter> dataParameters = null,
int commandTimeout = 10000,
CommandBehavior commandBehavior = CommandBehavior.CloseConnection)
{
return Get<T>(
connection,
command,
(IDataRecord rdr) => { return projector(rdr); },
dataParameters,
commandTimeout,
commandBehavior);
}
protected List<T> Get<T>(
IDbConnection connection,
IDbCommand command,
IList<IDataParameter> dataParameters = null,
int commandTimeout = 10000,
CommandBehavior commandBehavior = CommandBehavior.CloseConnection)
{
List<T> result = new List<T>();
connection.Open();
command.CommandTimeout = commandTimeout;
this.PrepareParameters(command, dataParameters);
using (var reader = command.ExecuteReader(commandBehavior))
{
var parser = parserFactory.GetParser<T>();
result = parser.Parse<T>(reader);
reader.Close();
}
if (commandBehavior == CommandBehavior.CloseConnection)
{
connection.Close();
}
return result;
}
private IEnumerable<T> Get<T>(
IDbConnection connection,
IDbCommand command,
Func<IDataReader, T> project,
IList<IDataParameter> dataParameters = null,
int commandTimeout = 10000,
CommandBehavior commandBehavior = CommandBehavior.CloseConnection)
{
connection.Open();
command.CommandTimeout = commandTimeout;
PrepareParameters(command, dataParameters);
using (var reader = command.ExecuteReader(commandBehavior))
{
while (reader.Read())
{
yield return project(reader);
}
reader.Close();
}
if (commandBehavior == CommandBehavior.CloseConnection)
{
connection.Close();
}
}
protected async Task<List<T>> GetAsync<T>(
DbConnection connection,
DbCommand command,
CancellationToken cancellationToken,
IList<IDataParameter> dataParameters = null,
CommandBehavior commandBehavior = CommandBehavior.CloseConnection)
{
var result = new List<T>();
await connection.OpenAsync();
PrepareParameters(command, dataParameters);
using (var reader = await command.ExecuteReaderAsync(cancellationToken))
{
var parser = parserFactory.GetParser<T>();
result = await parser.ParseAsync<T>(reader, cancellationToken);
reader.Close();
}
if (commandBehavior == CommandBehavior.CloseConnection)
{
connection.Close();
}
return result;
}
protected void PrepareParameters(IDbCommand command, IList<IDataParameter> dataParameters)
{
if (dataParameters != null)
{
foreach (IDataParameter item in dataParameters)
{
var param = command.CreateParameter();
param.DbType = item.DbType;
param.Direction = item.Direction;
param.ParameterName = item.ParameterName;
param.Value = item.Value;
}
}
}
}
}