sgt*_*_S2 5 c# entity-framework-core ef-core-3.0
我尝试在 ef core 3.0 中构建一个查询,该查询从数据库服务器获取完整过程
IEnumerable<int> stIds = stateIds;
var rtables = await db.Order.
Join(db.OrderDetail, order => order.OrderId, orderdetail => orderdetail.OrderId, (order, orderdetail) => new { order, orderdetail }).
Where(x => x.order.SellerId == sellerId && stIds.Contains(x.orderdetail.OrderStateId)&&x.order.RtableId != null)
.GroupBy(x =>
x.order.RtableId
)
.Select(x => new RtableState { RtableId = x.Key ?? 0, OrderStateId = x.OrderByDescending(x => x.orderdetail.OrderStateId).Select(x => x.orderdetail.OrderStateId).FirstOrDefault() }).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
{ "Message": "处理 LINQ 表达式 'AsQueryable<<>f__AnonymousType52>(OrderByDescending<<>f__AnonymousType52, int>(\r\n source: NavigationTreeExpression\r\n Value: default(IGrouping, <>f__AnonymousType52>) \r\n 表达式: (未处理的参数: e), \r\n keySelector: (x) => x.orderdetail.OrderStateId))' by 'NavigationExpandingExpressionVisitor' 失败。这可能表示 EF Core 中的错误或限制. 有关更多详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101433。", "Inner": "" }
我知道查询对于 EF Core 3.0 来说太复杂了,但这是一个错误还是它不应该工作?
我的解决方案是拆分请求。
IEnumerable<int> stIds = stateIds;
var rtableStatesServer = await db.Order.
Join(db.OrderDetail, order => order.OrderId, orderdetail => orderdetail.OrderId, (order, orderdetail) => new { order, orderdetail }).
Where(x => x.order.SellerId == sellerId && stIds.Contains(x.orderdetail.OrderStateId) && x.order.RtableId != null)
.GroupBy(x => new RtableState
{
RtableId =
x.order.RtableId ?? 0,
OrderStateId = x.orderdetail.OrderStateId
})
.Select(x => new RtableState { RtableId = x.Key.RtableId, OrderStateId = x.Key.OrderStateId }).ToListAsync();
var rtableStates = rtableStatesServer.GroupBy(r => r.RtableId,
(key, value) => new RtableState
{
RtableId = key,
OrderStateId = value.OrderByDescending(x=>x.OrderStateId).Select(x => x.OrderStateId).FirstOrDefault()
}).ToList();
Run Code Online (Sandbox Code Playgroud)
如异常消息所示,问题是由表达式引起的
x.OrderByDescending(y => y.orderdetail.OrderStateId)
.Select(y => y.orderdetail.OrderStateId)
.FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)
其中x是IGrouping<,>由GroupBy运算符产生的。
这可能表明 EF Core 中存在错误或限制。
我认为这是一个限制,它可能永远不会被修复,因为GroupBy包含除键和聚合表达式之外的表达式的结果没有自然的 SQL 等效项。
一般的解决方案是尽可能避免GroupBy并使用具有相关子查询的替代结构。但是这个特定的查询有简单自然的解决方案,因为表达式
set.OrderByDescending(item => item.Property).Select(item => itm.Property).FirstOfDefault()
Run Code Online (Sandbox Code Playgroud)
可以表示为
set.Max(item => item.Property)
Run Code Online (Sandbox Code Playgroud)
这是一个标准(因此支持聚合)。
将上述有问题的表达式替换为
x.Max(y => y.orderdetail.OrderStateId)
Run Code Online (Sandbox Code Playgroud)
问题就会得到解决。
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |