EF Core 3 Linq无法被翻译。

6

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

我遇到了以下错误:
{ "Message": "使用 LINQ 表达式 'AsQueryable<<>f__AnonymousType52>(OrderByDescending<<>f__AnonymousType52, int>(\r\n source: NavigationTreeExpression\r\n Value: default(IGrouping, <>f__AnonymousType52>)\r\n Expression: (Unhandled parameter: e), \r\n keySelector: (x) => x.orderdetail.OrderStateId))' 时,'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();

1个回答

8

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

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

这里的x是由GroupBy运算符产生的IGrouping<,>

这可能表明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)

并且问题将会得到解决。

1
谢谢,你说得对,我使用了 x.Max(),它起作用了!我想我把它想复杂了。 - sgt_S2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接