|
9 | 9 | namespace DevExtreme.AspNet.Data.Async { |
10 | 10 |
|
11 | 11 | class ReflectionAsyncAdapter : IAsyncAdapter { |
12 | | - QueryProviderInfo _providerInfo; |
| 12 | + readonly QueryProviderInfo _providerInfo; |
| 13 | + |
| 14 | + public static bool SupportsProvider(QueryProviderInfo providerInfo) |
| 15 | + => providerInfo.IsEFCore |
| 16 | + || IsEF6(providerInfo) |
| 17 | + || providerInfo.IsNH |
| 18 | + || providerInfo.IsXPO; |
| 19 | + |
| 20 | + static bool IsEF6(QueryProviderInfo providerInfo) |
| 21 | + => providerInfo.IsEFClassic && providerInfo.Version.Major >= 6; |
13 | 22 |
|
14 | 23 | public ReflectionAsyncAdapter(QueryProviderInfo providerInfo) { |
15 | 24 | _providerInfo = providerInfo; |
16 | 25 | } |
17 | 26 |
|
18 | | - bool IsEF6 => _providerInfo.IsEFClassic && _providerInfo.Version.Major >= 6; |
19 | | - bool IsEFCore => _providerInfo.IsEFCore; |
20 | | - bool IsNH => _providerInfo.IsNH; |
21 | | - bool IsXPO => _providerInfo.IsXPO; |
22 | | - |
23 | 27 | public Task<int> CountAsync(IQueryProvider provider, Expression expr, CancellationToken cancellationToken) { |
24 | 28 | MethodInfo GetCountAsyncMethod() { |
25 | | - if(IsEFCore) |
| 29 | + if(_providerInfo.IsEFCore) |
26 | 30 | return EFCoreMethods.CountAsyncMethod; |
27 | 31 |
|
28 | | - if(IsEF6) |
| 32 | + if(IsEF6(_providerInfo)) |
29 | 33 | return EF6Methods.CountAsyncMethod; |
30 | 34 |
|
31 | | - if(IsNH) |
| 35 | + if(_providerInfo.IsNH) |
32 | 36 | return NHMethods.CountAsyncMethod; |
33 | 37 |
|
34 | | - if(IsXPO) |
| 38 | + if(_providerInfo.IsXPO) |
35 | 39 | return XpoMethods.CountAsyncMethod; |
36 | 40 |
|
37 | | - throw ProviderNotSupported(provider); |
| 41 | + throw new NotSupportedException(); |
38 | 42 | } |
39 | 43 |
|
40 | 44 | return InvokeCountAsync(GetCountAsyncMethod(), provider, expr, cancellationToken); |
41 | 45 | } |
42 | 46 |
|
43 | 47 | public Task<IEnumerable<T>> ToEnumerableAsync<T>(IQueryProvider provider, Expression expr, CancellationToken cancellationToken) { |
44 | | - if(IsEFCore) |
| 48 | + if(_providerInfo.IsEFCore) |
45 | 49 | return InvokeToListAsync<T>(EFCoreMethods.ToListAsyncMethod, provider, expr, cancellationToken); |
46 | 50 |
|
47 | | - if(IsEF6) |
| 51 | + if(IsEF6(_providerInfo)) |
48 | 52 | return InvokeToListAsync<T>(EF6Methods.ToListAsyncMethod, provider, expr, cancellationToken); |
49 | 53 |
|
50 | | - if(IsNH) |
| 54 | + if(_providerInfo.IsNH) |
51 | 55 | return InvokeToListAsync<T>(NHMethods.ToListAsyncMethod, provider, expr, cancellationToken); |
52 | 56 |
|
53 | | - if(IsXPO) |
| 57 | + if(_providerInfo.IsXPO) |
54 | 58 | return InvokeToArrayAsync<T>(XpoMethods.ToArrayAsyncMethod, provider, expr, cancellationToken); |
55 | 59 |
|
56 | | - throw ProviderNotSupported(provider); |
57 | | - } |
58 | | - |
59 | | - static Exception ProviderNotSupported(IQueryProvider provider) { |
60 | | - var providerType = provider.GetType(); |
61 | | - if(providerType.IsGenericType) |
62 | | - providerType = providerType.GetGenericTypeDefinition(); |
63 | | - |
64 | | - var message = $"Async operations for the LINQ provider '{providerType.FullName}' are not supported." |
65 | | - + $" You can implement a custom async adapter ({typeof(IAsyncAdapter).FullName}) and register it via '{typeof(CustomAsyncAdapters).FullName}.{nameof(CustomAsyncAdapters.RegisterAdapter)}'."; |
66 | | - |
67 | | - return new NotSupportedException(message); |
| 60 | + throw new NotSupportedException(); |
68 | 61 | } |
69 | 62 |
|
70 | 63 | static class EF6Methods { |
|
0 commit comments