Skip to content

Commit 0055ce7

Browse files
committed
1. add support QueryMultiple and QueryMultipleAsync
1 parent 6497a57 commit 0055ce7

File tree

11 files changed

+246
-51
lines changed

11 files changed

+246
-51
lines changed

src/SmartSql.DapperDeserializer/DapperDataReaderDeserializer.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88
using System.Reflection;
99
using System.Text;
1010
using System.Threading.Tasks;
11-
11+
using Dapper;
1212
namespace SmartSql.DapperDeserializer
1313
{
1414
public class DapperDataReaderDeserializer : IDataReaderDeserializer
1515
{
16-
public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader)
16+
public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
1717
{
1818
try
1919
{
2020
if (dataReader.Read())
2121
{
22-
var rowParser = Dapper.SqlMapper.GetRowParser(dataReader, typeof(T));
22+
23+
var rowParser = dataReader.GetRowParser(typeof(T));
2324
do
2425
{
2526
var target = (T)rowParser(dataReader);
@@ -29,13 +30,12 @@ public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataRe
2930
}
3031
finally
3132
{
32-
dataReader.Dispose();
33-
dataReader.Close();
33+
Dispose(dataReader, isDispose);
3434
}
3535
}
3636

3737

38-
public T ToSingle<T>(RequestContext context, IDataReader dataReader)
38+
public T ToSingle<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
3939
{
4040
try
4141
{
@@ -45,12 +45,11 @@ public T ToSingle<T>(RequestContext context, IDataReader dataReader)
4545
}
4646
finally
4747
{
48-
dataReader.Dispose();
49-
dataReader.Close();
48+
Dispose(dataReader, isDispose);
5049
}
5150
}
5251
#region Async
53-
public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader)
52+
public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
5453
{
5554
try
5655
{
@@ -69,12 +68,11 @@ public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, I
6968
}
7069
finally
7170
{
72-
dataReader.Dispose();
73-
dataReader.Close();
71+
Dispose(dataReader, isDispose);
7472
}
7573
}
7674

77-
public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader)
75+
public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
7876
{
7977
try
8078
{
@@ -85,12 +83,18 @@ public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataRe
8583
}
8684
finally
8785
{
88-
dataReader.Dispose();
89-
dataReader.Close();
86+
Dispose(dataReader, isDispose);
9087
}
9188
}
9289

9390
#endregion
94-
91+
private void Dispose(IDataReader dataReader, bool isDispose)
92+
{
93+
if (isDispose)
94+
{
95+
dataReader.Dispose();
96+
dataReader = null;
97+
}
98+
}
9599
}
96100
}

src/SmartSql.Options/SmartSqlOptionsExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,12 @@ public static void AddSmartSqlOption(this IServiceCollection services)
4848
};
4949
});
5050
}
51+
52+
53+
public static void UserOptions(this SmartSqlOptions smartSqlOptions, IServiceProvider sp)
54+
{
55+
56+
57+
}
5158
}
5259
}

src/SmartSql.UTests/SmartSqlMapper_Test.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using SmartSql.UTests.Entity;
33
using System;
44
using System.Collections.Generic;
5+
using System.Linq;
56
using System.Threading.Tasks;
67
using Xunit;
78

@@ -167,6 +168,25 @@ public void QuerySingle()
167168
};
168169
var entity = _sqlMapper.QuerySingle<T_Entity>(context);
169170
}
171+
[Fact]
172+
public void QueryMultiple()
173+
{
174+
RequestContext context = new RequestContext
175+
{
176+
Scope = Scope,
177+
SqlId = "MultiQuery",
178+
Request = new
179+
{
180+
Taken = 10
181+
}
182+
};
183+
using (var mult = _sqlMapper.QueryMultiple(context))
184+
{
185+
var list1 = mult.Read<T_Entity>();
186+
var list2 = mult.Read<T_Entity>();
187+
}
188+
}
189+
170190
[Fact]
171191
public void GetDataTable()
172192
{
@@ -196,6 +216,9 @@ public void GetDataSet()
196216
var dataSet = _sqlMapper.GetDataSet(context);
197217
}
198218

219+
220+
221+
199222
#region Async
200223
[Fact]
201224
public async Task ExecuteAsync()
@@ -241,6 +264,26 @@ public async Task QuerySingleAsync()
241264
};
242265
var user = await _sqlMapper.QuerySingleAsync<T_Entity>(context);
243266
}
267+
268+
[Fact]
269+
public async Task QueryMultipleAsync()
270+
{
271+
RequestContext context = new RequestContext
272+
{
273+
Scope = Scope,
274+
SqlId = "MultiQuery",
275+
Request = new
276+
{
277+
Taken = 10
278+
}
279+
};
280+
using (var mult = await _sqlMapper.QueryMultipleAsync(context))
281+
{
282+
var list1 = await mult.ReadAsync<T_Entity>();
283+
var list2 = await mult.ReadAsync<T_Entity>();
284+
}
285+
}
286+
244287
[Fact]
245288
public async Task GetDataTableAsync()
246289
{

src/SmartSql/Abstractions/DataReaderDeserializer/IDataReaderDeserializer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ namespace SmartSql.Abstractions.DataReaderDeserializer
1313
/// </summary>
1414
public interface IDataReaderDeserializer : IDataReaderDeserializerAsync
1515
{
16-
T ToSingle<T>(RequestContext context,IDataReader dataReader);
17-
IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader);
16+
T ToSingle<T>(RequestContext context, IDataReader dataReader, bool isDispose = true);
17+
IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader, bool isDispose = true);
1818
}
1919
public interface IDataReaderDeserializerAsync
2020
{
21-
Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader);
22-
Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader);
21+
Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true);
22+
Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true);
2323
}
2424
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using System.Threading.Tasks;
5+
6+
namespace SmartSql.Abstractions
7+
{
8+
public interface IMultipleResult : IDisposable
9+
{
10+
T ReadSingle<T>();
11+
IEnumerable<T> Read<T>();
12+
13+
Task<T> ReadSingleAsync<T>();
14+
Task<IEnumerable<T>> ReadAsync<T>();
15+
}
16+
}

src/SmartSql/Abstractions/ISmartSqlMapper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public interface ISmartSqlMapper : ISmartSqlMapperAsync, ISession, ITransaction,
2323
T ExecuteScalar<T>(RequestContext context);
2424
IEnumerable<T> Query<T>(RequestContext context);
2525
T QuerySingle<T>(RequestContext context);
26+
IMultipleResult QueryMultiple(RequestContext context);
2627
DataTable GetDataTable(RequestContext context);
2728
DataSet GetDataSet(RequestContext context);
2829
}

src/SmartSql/Abstractions/ISmartSqlMapperAsync.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface ISmartSqlMapperAsync
1313
Task<T> ExecuteScalarAsync<T>(RequestContext context);
1414
Task<IEnumerable<T>> QueryAsync<T>(RequestContext context);
1515
Task<T> QuerySingleAsync<T>(RequestContext context);
16-
16+
Task<IMultipleResult> QueryMultipleAsync(RequestContext context);
1717
Task<DataTable> GetDataTableAsync(RequestContext context);
1818
Task<DataSet> GetDataSetAsync(RequestContext context);
1919
}

src/SmartSql/DataReaderDeserializer/EmitDataReaderDeserializer.cs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public EmitDataReaderDeserializer()
1616
{
1717
_dataRowParserFactory = new DataRowParserFactory();
1818
}
19-
public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader)
19+
public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
2020
{
2121
try
2222
{
@@ -33,12 +33,20 @@ public IEnumerable<T> ToEnumerable<T>(RequestContext context, IDataReader dataRe
3333
}
3434
finally
3535
{
36-
//while (dataReader.NextResult()) { }
37-
dataReader.Close();
36+
Dispose(dataReader, isDispose);
3837
}
3938
}
4039

41-
public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader)
40+
private void Dispose(IDataReader dataReader, bool isDispose)
41+
{
42+
if (isDispose)
43+
{
44+
dataReader.Dispose();
45+
dataReader = null;
46+
}
47+
}
48+
49+
public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
4250
{
4351
var dataReaderAsync = dataReader as DbDataReader;
4452
try
@@ -59,12 +67,11 @@ public async Task<IEnumerable<T>> ToEnumerableAsync<T>(RequestContext context, I
5967
}
6068
finally
6169
{
62-
//while (await dataReaderAsync.NextResultAsync()) { }
63-
dataReader.Close();
70+
Dispose(dataReader, isDispose);
6471
}
6572
}
6673

67-
public T ToSingle<T>(RequestContext context, IDataReader dataReader)
74+
public T ToSingle<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
6875
{
6976
try
7077
{
@@ -79,12 +86,11 @@ public T ToSingle<T>(RequestContext context, IDataReader dataReader)
7986
}
8087
finally
8188
{
82-
//while (dataReader.NextResult()) { }
83-
dataReader.Close();
89+
Dispose(dataReader, isDispose);
8490
}
8591
}
8692

87-
public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader)
93+
public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataReader, bool isDispose = true)
8894
{
8995
var dataReaderAsync = dataReader as DbDataReader;
9096
try
@@ -101,8 +107,7 @@ public async Task<T> ToSingleAsync<T>(RequestContext context, IDataReader dataRe
101107
}
102108
finally
103109
{
104-
//while (await dataReaderAsync.NextResultAsync()) { }
105-
dataReader.Close();
110+
Dispose(dataReader, isDispose);
106111
}
107112
}
108113
}

src/SmartSql/MultipleResult.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using SmartSql.Abstractions;
2+
using SmartSql.Abstractions.DataReaderDeserializer;
3+
using SmartSql.Abstractions.DbSession;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Data;
7+
using System.Data.Common;
8+
using System.Linq;
9+
using System.Text;
10+
using System.Threading.Tasks;
11+
12+
namespace SmartSql
13+
{
14+
public class MultipleResult : IMultipleResult
15+
{
16+
private readonly RequestContext _context;
17+
private IDataReader _dataReader;
18+
private readonly IDataReaderDeserializer _dataReaderDeserializer;
19+
private readonly IDbConnectionSessionStore _sessionStore;
20+
21+
public MultipleResult(
22+
RequestContext context
23+
, IDataReader dataReader
24+
, IDataReaderDeserializer dataReaderDeserializer
25+
, IDbConnectionSessionStore sessionStore
26+
)
27+
{
28+
_context = context;
29+
_dataReader = dataReader;
30+
_dataReaderDeserializer = dataReaderDeserializer;
31+
_sessionStore = sessionStore;
32+
}
33+
public T ReadSingle<T>()
34+
{
35+
var result = _dataReaderDeserializer.ToSingle<T>(_context, _dataReader, false);
36+
NextResult();
37+
return result;
38+
}
39+
public IEnumerable<T> Read<T>()
40+
{
41+
var result = _dataReaderDeserializer.ToEnumerable<T>(_context, _dataReader, false).ToList();
42+
NextResult();
43+
return result;
44+
}
45+
46+
47+
private void NextResult()
48+
{
49+
if (!_dataReader.NextResult())
50+
{
51+
Dispose();
52+
}
53+
}
54+
private async Task NextResultAsync()
55+
{
56+
var dataReaderAsync = _dataReader as DbDataReader;
57+
if (!await dataReaderAsync.NextResultAsync())
58+
{
59+
Dispose();
60+
}
61+
}
62+
public void Dispose()
63+
{
64+
if (_dataReader != null)
65+
{
66+
_dataReader.Dispose();
67+
_dataReader = null;
68+
}
69+
_sessionStore.Dispose();
70+
}
71+
72+
public async Task<T> ReadSingleAsync<T>()
73+
{
74+
var result = await _dataReaderDeserializer.ToSingleAsync<T>(_context, _dataReader, false);
75+
await NextResultAsync();
76+
return result;
77+
}
78+
79+
public async Task<IEnumerable<T>> ReadAsync<T>()
80+
{
81+
var result = await _dataReaderDeserializer.ToEnumerableAsync<T>(_context, _dataReader, false);
82+
await NextResultAsync();
83+
return result;
84+
}
85+
}
86+
}

src/SmartSql/SmartSql.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
<PackageProjectUrl>https://github.com/Ahoo-Wang/SmartSql</PackageProjectUrl>
1212
<RepositoryUrl>https://github.com/Ahoo-Wang/SmartSql</RepositoryUrl>
1313
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
14-
<Version>3.4.8</Version>
14+
<Version>3.5.0-pre1</Version>
1515
<PackageTags>orm sql read-write-separation cache redis dotnet-core cross-platform high-performance distributed-computing zookeeper</PackageTags>
1616
<PackageReleaseNotes>
17-
1. optimize default excute DataSourceChoice
17+
1. add support QueryMultiple and QueryMultipleAsync
1818
</PackageReleaseNotes>
1919
<PackageIconUrl>https://raw.githubusercontent.com/Ahoo-Wang/SmartSql/master/SmartSql.png</PackageIconUrl>
2020
<PackageLicenseUrl>https://raw.githubusercontent.com/Ahoo-Wang/SmartSql/master/LICENSE</PackageLicenseUrl>

0 commit comments

Comments
 (0)