簡體   English   中英

從EF Core中的子實體獲取最大值

[英]Get Max from child entity in EF Core

假設我有一些公司,這些公司的客戶都有訂單。 在一個搜索查詢中,我希望以“帶最新訂單的公司優先”的方式設置訂單。 (希望這很清楚)。

.OrderByDescending(x =>
x.Customers.Max(c => c.Orders.Any() ? 
        y.Orders.Max(o => (DateTime?) o.DateCreatedUtc) 
        : DateTime.MinValue)
) 
  • 如果客戶沒有訂單,則將最新的訂單日期視為DateTime.MinValue

目前,我收到此警告: LINQ表達式“ Max()”無法翻譯,將在本地進行評估

我們可以重寫它以便在服務器上進行評估嗎?

最初(我很抱歉)看起來與在Orderby中使用Max()完全相同 -確保您使用外部(基本上每個) Max / Min調用可為空的重載,然后進行翻譯。

仍然必須使用可為空的重載。 但是,這里有一個隱藏的陷阱。 -當前,EF Core只有在使用簡單成員選擇器和可選強制轉換的情況下,才能轉換聚合方法。 任何其他表達式都會導致客戶端評估,而不管類型是否可為空。

幸運的是,有一個簡單的解決方案適用於除“ Average以外的所有標准聚合-使用SelectMany將聚合集(可以大於一個,可以與參考導航屬性組合)展平到包含聚合實體的級別,然后在該集合上應用聚合函數。

還要確保不在聚合選擇器中使用條件表達式或類似表達式。 可空好事Max / Min重載是返回null的空集,所以沒有必要列入Any檢查。 null通常按順序排在第一位,因此通常不需要特殊的哨兵值。 並且即使您確實需要它們,也請確保使用C#來應用它們?? 聚合調用的運算符。

話雖如此,示例代碼段的可翻譯版本是

.OrderByDescending(x => 
    x.Customers.SelectMany(c => c.Orders).Max(o => (DateTime?)o.DateCreatedUtc))
//                  ^                                  ^
//               drill down                    convert to nullable

暫無
暫無

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

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