[英]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)
)
目前,我收到此警告: 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.