最近,我通過 EF 增強了我的知識,并保持最新狀態,我只是在 Pluralsight 上尋找洞路徑。考慮到這一點,我查看了朱莉·勒曼 (Julie Lerman) 的一些課程,順便說一下,她是一位出色的老師。
在課程中,簡要回顧了 linq 的一些內置功能以及它如何將其解釋到查詢中。我只是想知道這是否會隨著功能發布而更新,并想知道為什么會這樣。
來自 Entity Framework Core:Getting Started courese Quote:“最后的方法要求查詢按方法排序,否則將回傳完整集,然后選擇記憶體中的最后一個。”
謝謝
uj5u.com熱心網友回復:
First/Last 方法都應該總是有一個 Order By 子句來嘗試確保結果是可重復的。在 EF linq 運算式中使用 Last 方法確實沒有充分的理由,只需顛倒順序并使用 First 方法即可。唯一可能的原因是您需要查詢運算式中的第一個和最后一個專案的情況。
您可以通過運行分析器并檢查生成的 SQL 來了解 EF 正在做什么。我想到了為什么 EF 需要 Order By 子句來執行 Last 操作的兩個原因。第一個是 SQL 通常會使用類似于 MAX(...) 運算式的東西來處理 LAST 型別的場景,這需要一列或多列來計算。第二是它可能會通過條件來扭轉現有的順序。我認為這將是第一個選項,但查看生成的 SQL,它實際上是第二個選項。
var test = context.Parents.OrderBy(x => x.Name).First();
SELECT TOP(1) [p].[ParentId], [p].[MasterParentId], [p].[Name]
FROM [Parents] AS [p]
ORDER BY [p].[Name]
go
var test = context.Parents.OrderBy(x => x.Name).Last();
SELECT TOP(1) [p].[ParentId], [p].[MasterParentId], [p].[Name]
FROM [Parents] AS [p]
ORDER BY [p].[Name] DESC
go
您可能與 SQL Server 一起使用的 MAX 方法可能依賴于提供程式,并且在使用多個 Order By 運算式時可能會出現問題。
值得注意的是,EF 支持 Linq 方法的能力是特定于提供者實作的,因此并非所有提供者或 EF 的所有版本都支持所有操作。例如,EF6 不支持Last/LastOrDefault方法,他們希望您反轉 Order By 條件并使用First*.
Last 方法需要 OrderBy 子句以避免在記憶體中執行操作的原因可能是 EF 會生成一個查詢,將值與MAX(...)操作進行比較。沒有它,它無法生成 SQL 陳述句來獲取最后一行,并且必須加載所有內容以進行列舉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335660.html
