C# .NET核心自动映射器使用ASDataSource或ProjectTo
我在AutoMapper docu中读到,UseAsDataSource应该和ProjectTo做同样的工作。然而,我有一个非常奇怪的问题: 此代码正在运行:C# .NET核心自动映射器使用ASDataSource或ProjectTo,c#,asp.net,entity-framework,.net-core,automapper,C#,Asp.net,Entity Framework,.net Core,Automapper,我在AutoMapper docu中读到,UseAsDataSource应该和ProjectTo做同样的工作。然而,我有一个非常奇怪的问题: 此代码正在运行: var _query = this.IUnitOfWork.IDataCrmRepository.contacts .Where(w => w.org_id == config_org_id) .UseAs
var _query = this.IUnitOfWork.IDataCrmRepository.contacts
.Where(w => w.org_id == config_org_id)
.UseAsDataSource(this.IMapper.ConfigurationProvider)
.For<DTO.contact>()
;
// nov order by optional navigation property (address) which may be null
_query = _query.OrderBy(o => o.address.city);
return _query.ToArray();
这就是区别吗
好的,我不必了解所有内容,让我们继续使用UseAsDataSource
。但是,当我尝试实现async/await时,要返回await\u query.ToArrayAsync()代码>它不适用于UseAsDataSource
,我遇到另一个错误:
Connection id "0HLIBS9MUOGQR", Request id "0HLIBS9MUOGQR:00000001": An unhandled exception was thrown by the application.
System.InvalidOperationException: The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations.
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.CountAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
为了使这一点更加复杂,当我删除.OrderBy调用时,ProjectTo与async/await配合得很好
有什么想法吗?关于ProjectTo,您可能遇到了EF核心问题。检查。使用它,您可以编写一个在没有AM的情况下失败的查询。然后检查EF核心问题的想法。当我在项目中将order by语句改为:\u query=\u query.OrderBy(o=>(o.address!=null)?o.address.city:null)代码>然后它就工作了。。奇怪..ProjectTo应该是链中的最后一个调用。否则,结果将因IQueryable提供程序而异。有些人会把数据翻译成acceses,有些人不会。UseAsDataSource应该在这方面有所帮助,但我对此了解不多。而且总是有表达式映射。
Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HLIBS29CUR23", Request id "0HLIBS29CUR23:00000006": An unhandled exception was thrown by the application.
System.NullReferenceException: Object reference not set to an instance of an object.
at lambda_method(Closure , TransparentIdentifier`2 )
at System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count)
at System.Linq.EnumerableSorter`1.ComputeMap(TElement[] elements, Int32 count)
at System.Linq.EnumerableSorter`1.ElementAt(TElement[] elements, Int32 count, Int32 idx)
at System.Linq.OrderedEnumerable`1.GetEnumerator(Int32 minIdx, Int32 maxIdx)+MoveNext()
at System.Linq.Enumerable.SelectIPartitionIterator`2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
Connection id "0HLIBS9MUOGQR", Request id "0HLIBS9MUOGQR:00000001": An unhandled exception was thrown by the application.
System.InvalidOperationException: The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations.
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.CountAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)