Skip to content

Commit 320b923

Browse files
committed
Enhancing ORM QueryBuilder with async
1 parent 6a78091 commit 320b923

File tree

1 file changed

+73
-12
lines changed

1 file changed

+73
-12
lines changed

Foundation.NetStandard-2.0/Data/SqlClient/Orm/QueryBuilder.cs

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ public string Build()
2222
stringBuilder.Append($@"using System;
2323
using System.Collections.ObjectModel;
2424
using System.Data;
25+
using System.Data.Common;
2526
using System.Threading;
27+
using System.Threading.Tasks;
2628
using Foundation.Assertions;
2729
using Foundation.Data;
2830
using Foundation.Data.SqlClient;
@@ -57,9 +59,15 @@ private string GetHandlerClass()
5759
stringBuilder.Append(" }\r\n\r\n");
5860
stringBuilder.Append(GetHandleQueryMethod().Indent(1));
5961
stringBuilder.Append("\r\n\r\n");
60-
stringBuilder.Append(GetCreateParametersMethod().Indent(1));
62+
stringBuilder.Append(GetHandleQueryAsyncMethod().Indent(1));
6163
stringBuilder.Append("\r\n\r\n");
62-
stringBuilder.Append(GetHandleRequestMethod().Indent(1));
64+
stringBuilder.Append(GetToExecuteReaderRequestMethod().Indent(1));
65+
stringBuilder.Append("\r\n\r\n");
66+
stringBuilder.Append(GetToParametersMethod().Indent(1));
67+
stringBuilder.Append("\r\n\r\n");
68+
stringBuilder.Append(GetExecuteReaderMethod().Indent(1));
69+
stringBuilder.Append("\r\n\r\n");
70+
stringBuilder.Append(GetExecuteReaderAsyncMethod().Indent(1));
6371
stringBuilder.Append("\r\n\r\n");
6472

6573
var sequence = new Sequence();
@@ -82,24 +90,44 @@ private string GetHandlerClass()
8290
private string GetHandleQueryMethod()
8391
{
8492
var stringBuilder = new StringBuilder();
85-
8693
stringBuilder.Append($@"public {_query.Name}QueryResult Handle({_query.Name}Query query)
8794
{{
8895
Assert.IsNotNull(query);
89-
var parameters = CreateParameters(query);
96+
var request = ToExecuteReaderRequest(query, CancellationToken.None);
97+
return ExecuteReader(request);
98+
}}");
99+
return stringBuilder.ToString();
100+
}
101+
102+
private string GetHandleQueryAsyncMethod()
103+
{
104+
var stringBuilder = new StringBuilder();
105+
stringBuilder.Append($@"public Task<{_query.Name}QueryResult> HandleAsync({_query.Name}Query query, CancellationToken cancellationToken)
106+
{{
107+
Assert.IsNotNull(query);
108+
var request = ToExecuteReaderRequest(query, cancellationToken);
109+
return ExecuteReaderAsync(request);
110+
}}");
111+
return stringBuilder.ToString();
112+
}
113+
114+
private string GetToExecuteReaderRequestMethod()
115+
{
116+
var stringBuilder = new StringBuilder();
117+
stringBuilder.Append($@"private ExecuteReaderRequest ToExecuteReaderRequest({_query.Name}Query query, CancellationToken cancellationToken)
118+
{{
119+
var parameters = ToParameters(query);
90120
const int commandTimeout = 0;
91121
var createCommandRequest = new CreateCommandRequest(CommandText, parameters, CommandType.Text, commandTimeout, _transaction);
92-
var executeReaderRequest = new ExecuteReaderRequest(createCommandRequest, CommandBehavior.Default, CancellationToken.None);
93-
return Handle(executeReaderRequest);
122+
return new ExecuteReaderRequest(createCommandRequest, CommandBehavior.Default, cancellationToken);
94123
}}");
95-
96124
return stringBuilder.ToString();
97125
}
98126

99-
private string GetCreateParametersMethod()
127+
private string GetToParametersMethod()
100128
{
101129
var stringBuilder = new StringBuilder();
102-
stringBuilder.Append($"private static ReadOnlyCollection<object> CreateParameters({_query.Name}Query query)\r\n");
130+
stringBuilder.Append($"private static ReadOnlyCollection<object> ToParameters({_query.Name}Query query)\r\n");
103131
stringBuilder.Append("{\r\n");
104132
stringBuilder.Append(" var parameters = new SqlParameterCollectionBuilder();\r\n");
105133

@@ -115,11 +143,10 @@ private string GetCreateParametersMethod()
115143
return stringBuilder.ToString();
116144
}
117145

118-
private string GetHandleRequestMethod()
146+
private string GetExecuteReaderMethod()
119147
{
120148
var stringBuilder = new StringBuilder();
121-
122-
stringBuilder.Append($@"private {_query.Name}QueryResult Handle(ExecuteReaderRequest request)
149+
stringBuilder.Append($@"private {_query.Name}QueryResult ExecuteReader(ExecuteReaderRequest request)
123150
{{
124151
{_query.Name}QueryResult result = null;
125152
var executor = _connection.CreateCommandExecutor();
@@ -158,6 +185,40 @@ private string GetHandleRequestMethod()
158185
return stringBuilder.ToString();
159186
}
160187

188+
private string GetExecuteReaderAsyncMethod()
189+
{
190+
var stringBuilder = new StringBuilder();
191+
stringBuilder.Append($@"private async Task<{_query.Name}QueryResult> ExecuteReaderAsync(ExecuteReaderRequest request)
192+
{{
193+
{_query.Name}QueryResult result = null;
194+
var connection = (DbConnection) _connection;
195+
var executor = connection.CreateCommandAsyncExecutor();
196+
await executor.ExecuteReaderAsync(request, async dataReader =>
197+
{{
198+
{GetExecuteReaderAsyncMethodFragment().Indent(2)}
199+
}});
200+
201+
return result;
202+
}}");
203+
return stringBuilder.ToString();
204+
}
205+
206+
private string GetExecuteReaderAsyncMethodFragment()
207+
{
208+
var stringBuilder = new StringBuilder();
209+
var sequence = new Sequence();
210+
foreach (var result in _query.Results)
211+
{
212+
var next = sequence.Next() == 0 ? null : "Next";
213+
stringBuilder.Append($"var {ToLower(result.Name)} = (await dataReader.Read{next}ResultAsync(Read{result.Name}, request.CancellationToken)).AsReadOnly();\r\n");
214+
}
215+
216+
stringBuilder.Append($"result = new {_query.Name}QueryResult({GetResultVariableNames()});");
217+
return stringBuilder.ToString();
218+
}
219+
220+
private string GetResultVariableNames() => string.Join(", ", _query.Results.Select(i => ToLower(i.Name)));
221+
161222
private string GetRecordClasses()
162223
{
163224
var stringBuilder = new StringBuilder();

0 commit comments

Comments
 (0)