Skip to content

Commit 64935a5

Browse files
authored
Merge pull request #823 from ScarletKuro/development
Add type check for IAsyncEnumerable<> to Mapster.EF.Core:
2 parents 156c496 + 08cece9 commit 64935a5

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/Mapster.EFCore.Tests/EFCoreTest.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System;
77
using System.Collections.Generic;
88
using System.Linq;
9+
using System.Threading.Tasks;
910

1011
namespace Mapster.EFCore.Tests
1112
{
@@ -45,6 +46,34 @@ public void TestFindObject()
4546
first.Grade.ShouldBe(Grade.F);
4647
}
4748

49+
[TestMethod]
50+
public async Task TestFindSingleObjectUsingProjectToType()
51+
{
52+
var options = new DbContextOptionsBuilder<SchoolContext>()
53+
.UseInMemoryDatabase(Guid.NewGuid().ToString("N"))
54+
.Options;
55+
var context = new SchoolContext(options);
56+
DbInitializer.Initialize(context);
57+
58+
var mapsterInstance = new Mapper();
59+
60+
var query = context.Students.Where(s => s.ID == 1);
61+
62+
async Task<StudentDto> FirstExecute() =>
63+
await mapsterInstance.From(query)
64+
.ProjectToType<StudentDto>()
65+
.FirstOrDefaultAsync();
66+
67+
await Should.NotThrowAsync(async () =>
68+
{
69+
var first = await FirstExecute();
70+
71+
first.ShouldNotBeNull();
72+
first.ID.ShouldBe(1);
73+
first.LastName.ShouldBe("Alexander");
74+
});
75+
}
76+
4877
[TestMethod]
4978
public void MapperInstance_From_OrderBy()
5079
{

src/Mapster.EFCore/MapsterQueryable.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,21 @@ public TResult ExecuteAsync<TResult>(Expression expression, CancellationToken ca
8282
{
8383
var enumerable = ((IAsyncQueryProvider)_provider).ExecuteAsync<TResult>(expression, cancellationToken);
8484
var enumerableType = typeof(TResult);
85+
if (!IsAsyncEnumerableType(enumerableType))
86+
{
87+
return enumerable;
88+
}
8589
var elementType = enumerableType.GetGenericArguments()[0];
8690
var wrapType = typeof(MapsterAsyncEnumerable<>).MakeGenericType(elementType);
8791
return (TResult) Activator.CreateInstance(wrapType, enumerable, _builder);
8892
}
8993

94+
private static bool IsAsyncEnumerableType(Type type)
95+
{
96+
return type.GetInterfaces()
97+
.Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>));
98+
}
99+
90100
public IAsyncEnumerable<TResult> ExecuteEnumerableAsync<TResult>(Expression expression, CancellationToken cancellationToken = default)
91101
{
92102
var enumerable = ((IAsyncQueryProvider)_provider).ExecuteAsync<IAsyncEnumerable<TResult>>(expression, cancellationToken);

0 commit comments

Comments
 (0)