簡體   English   中英

EF Core 3 Linq 無法翻譯

[英]EF Core 3 Linq could not be translated

我試圖在 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 來源: 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": "" }

我知道查詢對於 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()

其中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)

問題將得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM