Skip to content

Commit 21adf61

Browse files
committed
✨feat: ValueTuple support for Entity methods
Added ValueTuple support in Entity methods for Get & List. The methods can now be used as ListAsync<(TypeA, TypeB)> with up to seven elements.
1 parent a278a87 commit 21adf61

File tree

4 files changed

+120
-3
lines changed

4 files changed

+120
-3
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using Dapper.Contrib.Extensions;
2+
using System.Linq;
3+
using Simpleverse.Repository.Db.Extensions;
4+
using Simpleverse.Repository.Db.Extensions.Dapper;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
using System;
8+
9+
namespace Simpleverse.Repository.Db.Test.SqlServer.Entity
10+
{
11+
[Collection("SqlServerCollection")]
12+
public class EntityTest : TestFixture
13+
{
14+
public EntityTest(DatabaseFixture fixture, ITestOutputHelper output)
15+
: base(fixture, output)
16+
{
17+
18+
}
19+
20+
[Fact]
21+
public void ListAsyncTupleTest()
22+
{
23+
using (var profiler = Profile())
24+
using (var connection = _fixture.GetConnection())
25+
{
26+
// arange
27+
connection.Open();
28+
connection.Truncate<Identity>();
29+
connection.Truncate<ExplicitKey>();
30+
var explicitKeyRecords = TestData.ExplicitKeyData(10);
31+
var identityRecords = TestData.IdentityWithIdData(10);
32+
33+
connection.Insert(explicitKeyRecords);
34+
connection.Insert(identityRecords);
35+
36+
var entity = new IdentityEntity(_fixture);
37+
38+
// act
39+
var records = entity.ListAsync<(Identity identity, ExplicitKey explicitKey)>().Result;
40+
41+
// assert
42+
Assert.Equal(10, records.Count());
43+
foreach (var record in records)
44+
{
45+
Assert.NotEqual(0, record.identity.Id);
46+
Assert.NotEqual(0, record.explicitKey.Id);
47+
}
48+
}
49+
}
50+
51+
[Fact]
52+
public void ListAsyncTupleFailTest()
53+
{
54+
var entity = new IdentityEntity(_fixture);
55+
56+
// act
57+
var exception = Assert.Throws<NotSupportedException>(
58+
() => entity.ListAsync<(
59+
Identity identity1,
60+
Identity identity2,
61+
Identity identity3,
62+
Identity identity4,
63+
Identity identity5,
64+
Identity identity6,
65+
Identity identity7,
66+
Identity identity8
67+
) >().Result
68+
);
69+
70+
Assert.Equal("Number of Tuple arguments is more than the supported 7.", exception.Message);
71+
}
72+
}
73+
74+
public class IdentityEntity : Entity<Identity, QueryFilter, DbQueryOptions>
75+
{
76+
public IdentityEntity(DatabaseFixture fixture)
77+
: base(new DbRepository(() => fixture.GetConnection()), new Table<Identity>("I"))
78+
{
79+
}
80+
81+
protected override void SelectQuery(QueryBuilder<Identity> builder, QueryFilter filter, DbQueryOptions options)
82+
{
83+
var explicitKey = new Table<ExplicitKey>("EK");
84+
85+
builder.SelectAll(explicitKey);
86+
87+
builder.Join(
88+
explicitKey,
89+
i => i.Id,
90+
ek => ek.Id
91+
);
92+
93+
base.SelectQuery(builder, filter, options);
94+
}
95+
}
96+
}

src/Simpleverse.Repository.Db/DbRepository.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ public async Task<IEnumerable<dynamic>> QueryAsync(string rawSql, object paramet
7474
return await ExecuteAsync((conn, tran) => conn.QueryAsync<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, (TFirst, TSecond, TThird, TFourth, TFifth, TSixth)>(rawSql, (first, second, third, fourth, fifth, sixth) => (first, second, third, fourth, fifth, sixth), param: parameters, transaction: tran));
7575
}
7676

77+
public async Task<IEnumerable<(TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh)>> QueryAsync<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(string rawSql, object parameters)
78+
{
79+
return await ExecuteAsync((conn, tran) => conn.QueryAsync<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, (TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh)>(rawSql, (first, second, third, fourth, fifth, sixth, seventh) => (first, second, third, fourth, fifth, sixth, seventh), param: parameters, transaction: tran));
80+
}
81+
7782
public async Task<int> ExecuteAsync(SqlBuilder.Template query)
7883
{
7984
return await ExecuteAsync((conn, tran) => conn.ExecuteAsync(query.RawSql, param: query.Parameters, transaction: tran));

src/Simpleverse.Repository.Db/Entity.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,23 @@ public virtual Task<IEnumerable<T>> ListAsync<T>(TFilter filter, TOptions option
102102
var builder = Source.AsQuery();
103103
SelectQuery(builder, filter, options);
104104

105+
var type = typeof(T);
106+
105107
var query = SelectTemplate(builder, options);
108+
if (type.Name.StartsWith("ValueTuple`"))
109+
{
110+
var typeArguments = type.GenericTypeArguments;
111+
var typeArgumentsCount = typeArguments.Count();
112+
if (typeArgumentsCount > 7)
113+
throw new NotSupportedException("Number of Tuple arguments is more than the supported 7.");
114+
115+
return (Task<IEnumerable<T>>) Repository
116+
.GetType()
117+
.GetMethod(nameof(Repository.QueryAsync), typeArgumentsCount, new[] { query.GetType() } )
118+
.MakeGenericMethod(type.GenericTypeArguments)
119+
.Invoke(Repository, new[] { query });
120+
}
121+
106122
return Repository.QueryAsync<T>(query);
107123
}
108124

src/Simpleverse.Repository.Db/Simpleverse.Repository.Db.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
1414
<PackageTags>Dapper, Bulk, Merge, Upsert, Delete, Insert, Update, Repository</PackageTags>
1515
<PackageLicenseFile>LICENSE</PackageLicenseFile>
16-
<Version>2.0.19</Version>
16+
<Version>2.0.20</Version>
1717
<Description>High performance operation for MS SQL Server built for Dapper ORM. Including bulk operations Insert, Update, Delete, Get as well as Upsert both single and bulk.</Description>
18-
<AssemblyVersion>2.0.19</AssemblyVersion>
19-
<FileVersion>2.0.19</FileVersion>
18+
<AssemblyVersion>2.0.20</AssemblyVersion>
19+
<FileVersion>2.0.20</FileVersion>
2020
<RepositoryUrl>https://github.com/lukaferlez/Simpleverse.Repository</RepositoryUrl>
2121
<PackageReadmeFile>README.md</PackageReadmeFile>
2222
<EmbedAllSources>true</EmbedAllSources>

0 commit comments

Comments
 (0)