我试图使我的代码更简洁,更容易阅读,但我得到了一个efcore异常(他们指出这可能是一个限制),只是想看看是否有人能帮上忙。
我使用的是.net3.1和efcore也是3.1。
原代码工作:
public Response GetAll(long myId, DataSourceLoadOptions loadOptions)
{
var dbContext = ContextFactory.GetContext<IMyContext>();
var query = dbContext.Table1.Where(_ => _.Id == myId).Select(ent1 => new
{
Id = ent1.Id,
State = ent1.State,
MatCode = ent1.Mat.Code,
AmountToFulfill = ent1.AmountRequested,
AmountReserved = dbContext.Table2.Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active).Select(_ => _.AmountReserved).Sum(),
LastChangeTime = ent1.ChangeTime,
});
return query.ToList();
}
非工作代码:
public Response GetAll2(long myId, DataSourceLoadOptions loadOptions)
{
var dbContext = ContextFactory.GetContext<IMyContext>();
var query = dbContext.Table1.Where(_ => _.Id == myId).Select(ent1 => new
{
Id = ent1.Id,
State = ent1.State,
MatCode = ent1.Mat.Code,
AmountToFulfill = ent1.AmountRequested,
AmountReserved = GetReservedAmount(dbContext, ent1).Sum(),
LastChangeTime = ent1.ChangeTime,
});
return query.ToList();
}
private static IQueryable<int> GetReservedAmount(IMyContext dbContext, IEntity1 ent1)
{
return dbContext.Table2
.Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active)
.Select(_ => _.AmountReserved);
}
例外:
21:26:28.1605在执行请求时发生了未处理的异常。{ SourceContext="Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware",{Id=1,Name="UnhandledException"},EventId=RequestId=“0HxxxA83M7JB:00000001”,RequestPath="/xxxxxxxxxx/2",SpanId="|5exxx39-48248xxxxx5b806.1.eee74277_",TraceId="5e3cde39-4824xxxxx",ParentId=“5e3xxxde39-48248xxxxxxxxxa25b806.1”,ConnectionId=“0xxxxx”,ThreadId=11} System.InvalidOperationException:处理Q表达式'ClassName.GetAll2( dbContext:__dbContext_1,op:(NavigationTreeExpression Value:(dbContext:dbContext)表达式:#))#en21 20()被‘’失败。这可能表示EF中存在缺陷或限制。有关更多详细信息,请参见https://go.microsoft.com/fwlink/?linkid=2101433。在Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) .
发布于 2022-04-12 21:41:04
你所犯的错误给了你完整的解释--哪里出了问题:
处理LINQ表达式'ClassName.GetAll2( dbContext:__dbContext_1,op:(NavigationTreeExpression值:(EntityReference: Entity1)表达式:o.Outer) .Sum()‘NavigationExpandingExpressionVisitor’失败。
如果您转到提供的链接(https://go.microsoft.com/fwlink/?linkid=2101433),那么您可以读到:
EF支持顶层投影中的部分客户端评估(本质上是对Select()的最后调用)。如果查询中的顶级投影不能转换到服务器,EF将从服务器获取任何所需的数据,并在客户机上评估查询的其余部分。如果EF Core在顶层投影之外的任何地方检测到一个表达式,而该表达式不能被转换到服务器,那么它将抛出一个运行时异常。
你的方法
private static IQueryable<int> GetReservedAmount(IMyContext dbContext, IEntity1 ent1)
{
return dbContext.Table2
.Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active)
.Select(_ => _.AmountReserved);
}
无法转换为TSQL查询语法。
仅此而已,EF 3.0客户端方法不能转换为TSQL。
https://stackoverflow.com/questions/71848931
复制相似问题