gpt4 book ai didi

c# - 无法翻译 EF Core 3 Linq

转载 作者:行者123 更新时间:2023-11-30 16:37:20 24 4
gpt4 key购买 nike

我尝试在 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();

我收到这个错误:

{ “消息”:“处理 LINQ 表达式 'AsQueryable<<>f__AnonymousType52>(OrderByDescending<<>f__AnonymousType52, int>(\r\n 来源:NavigationTreeExpression\r\n 值:默认值(IGrouping, <>f__AnonymousType52>)\r\n Expression: (Unhandled parameter: e),\r\n keySelector: (x) => x.orderdetail.OrderStateId))' by 'NavigationExpandingExpressionVisitor' 失败。这可能表示 EF Core 中存在错误或限制。有关更多详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101433。", “内部”:“”

我知道查询对于 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();

最佳答案

如异常消息所示,问题是由表达式引起的

x.OrderByDescending(y => y.orderdetail.OrderStateId)
.Select(y => y.orderdetail.OrderStateId)
.FirstOrDefault()

哪里xIGrouping<,>制作人 GroupBy运营商。

This may indicate either a bug or a limitation in EF Core.

我认为这是一个限制,可能永远不会被修复,因为 GroupBy包含键和聚合表达式以外的表达式的结果没有自然的 SQL 等价物。

一般的解决办法是避免GroupBy在可能的情况下,并使用具有相关子查询的替代构造。但是这个特定的查询有简单的自然解决方案,因为表达式

set.OrderByDescending(item => item.Property).Select(item => itm.Property).FirstOfDefault() 

可以用

表示
set.Max(item => item.Property)

这是一个标准(因此支持聚合)。

将上述有问题的表达式替换为

x.Max(y => y.orderdetail.OrderStateId)

问题就解决了。

关于c# - 无法翻译 EF Core 3 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com