简体   繁体   English

EF Core 3 Linq 无法翻译

[英]EF Core 3 Linq could not be translated

I tried to build a query in ef core 3.0 that gets the full process from the db server我试图在 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();

I get this error:我收到此错误:

{ "Message": "Processing of the LINQ expression '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))' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.", "Inner": "" } { "Message": "LINQ 表达式的处理 'AsQueryable<<>f__AnonymousType52>(OrderByDescending<<>f__AnonymousType52, int>(\r\n 来源: NavigationTreeExpression\r\n 值: default(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 。", "Inner": "" }

I know the query is too complex for EF Core 3.0, but is this a bug or should it not work?我知道查询对于 EF Core 3.0 来说太复杂了,但这是一个错误还是应该不起作用?

My solution is to split the request.我的解决方案是拆分请求。

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();

As indicated in the exception message, the problem is caused by the expression如异常消息中所示,问题是由表达式引起的

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

where x is IGrouping<,> produced by GroupBy operator.其中x是由GroupBy运算符生成的IGrouping<,>

This may indicate either a bug or a limitation in EF Core.这可能表示 EF Core 中的错误或限制。

I would consider it a limitation, which might never be fixed because GroupBy result containing expressions other than key and aggregate expressions have no natural SQL equivalent.我认为这是一个限制,它可能永远不会被修复,因为包含除键和聚合表达式以外的表达式的GroupBy结果没有自然的 SQL 等效项。

The general solution is to avoid GroupBy where possible and use alternative constructs with correlated subqueries.一般的解决方案是尽可能避免使用GroupBy并使用具有相关子查询的替代构造。 But this particular query has simple natural solution because the expression但是这个特定的查询有简单的自然解决方案,因为表达式

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

can be expressed with可以用

set.Max(item => item.Property)

which is a standard (thus supported aggregate).这是一个标准(因此支持聚合)。

Replace the aforementioned problematic expression with将上述有问题的表达式替换为

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

and the problem will be solved.问题将得到解决。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM