-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDbObjectReader.cs
More file actions
65 lines (55 loc) · 2.23 KB
/
Copy pathDbObjectReader.cs
File metadata and controls
65 lines (55 loc) · 2.23 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
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace DataBoss.Data
{
public abstract class DbObjectReader<TCommand, TReader>
where TCommand : IDbCommand
where TReader : IDataReader
{
static readonly Regex FormatEx = new Regex(@"(@[A-Za-z_]+)");
static readonly Func<TCommand, TReader> ExecuteReader = Lambdas.Func<TCommand, TReader>(nameof(IDbCommand.ExecuteReader));
readonly Func<TCommand> newCommand;
public DbObjectReader(Func<TCommand> newCommand) {
this.newCommand = newCommand;
}
public TimeSpan? CommandTimeout = TimeSpan.FromSeconds(30);
public IEnumerable<T> Read<T>(string command) => Query(command, new { }).Read<T>();
public IEnumerable<T> Read<T>(string command, ConverterCollection converters) => Query(command, new { }).Read<T>(converters);
public T Single<T>(string command) => Read<T>(command).Single();
public DbObjectQuery<TCommand, TReader> Query<T>(string command, T args) =>
new DbObjectQuery<TCommand, TReader>(() => {
var cmd = CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = command;
AddParameters(cmd, args);
return cmd;
}, ExecuteReader);
public DbObjectQuery<TCommand, TReader> Query<T, T2>(string command, IEnumerable<T> args, Func<T, T2> toArg) =>
new DbObjectQuery<TCommand, TReader>(() => {
var q = new StringBuilder();
var cmd = CreateCommand();
var format = FormatEx.Replace(command, "$1$${0}");
using (var item = args.GetEnumerator())
for (var n = 0; item.MoveNext(); ++n) {
var first = cmd.Parameters.Count;
AddParameters(cmd, toArg(item.Current));
for (var i = first; i != cmd.Parameters.Count; ++i)
((IDbDataParameter)cmd.Parameters[i]).ParameterName += "$" + n;
q.AppendFormat(format, n);
q.AppendLine();
}
cmd.CommandText = q.ToString();
return cmd;
}, ExecuteReader);
public abstract void AddParameters<T>(TCommand cmd, T args);
TCommand CreateCommand() {
var cmd = newCommand();
cmd.CommandTimeout = CommandTimeout.HasValue ? (int)CommandTimeout.Value.TotalSeconds : 0;
return cmd;
}
}
}