[英]What is the difference between these two LINQ Queries and how to correctly optimize them?
我有一個客戶表,其中包含以下列:Id、FirstName、LastName、CurrencyId、Gender。
我想 select 對應於 Id 10 的客戶貨幣,所以我正在做這樣的事情:
var currencyId = Db.Clients.FirstOrDefault(c=>c.Id == 10)?.CurrencyId;
此行是從 Db 中獲取所有屬性並在代碼中選擇貨幣還是在數據庫中執行類似的操作:
SELECT currencyId FROM Client WHERE ID = 10
或者我應該這樣寫 linq :
var currencyId = Db.Clients.Where(c=>c.Id == 10).Select(c=>c.CurrnecyId).FirstOrDefault();
這兩個查詢有什么區別? 將上述 SQL 查詢轉換為 linq 查詢的正確方法是什么?
我自己調查了一下,因為我發現大多數人的答案都是有問題的。 我希望FirstOrDefault
實現結果(您還可以從不再使用查詢對象的類型中看到),這意味着它會查詢所有屬性。
與第二個查詢不同,您在過濾您喜歡的屬性時仍在使用查詢,因此取決於實現,它可用於過濾屬性和選擇特定字段。
以下是使用 EF 為兩個類似查詢生成的查詢示例,其中顯示兩者都生成不同的查詢: https://dotnetfiddle.net/5aFJAZ
在您的第一個示例中, var currencyId = Db.Clients.FirstOrDefault(c=>c.Id == 10)?.CurrencyId;
查詢選擇整個 object 到 memory 然后從 memory ZA8CFDE6331149EB2ACZ96F8 中返回 Id 屬性。 因此,它需要執行類似以下的操作 SQL: SELECT * FROM Clients WHERE Id = 10
。 我知道我在這里沒有使用參數,並且 EF 確實拼出了每一列。 然而,這里要理解的關鍵是,通過返回比您需要的更多的列,您可能會設置性能問題,因為不會使用 Id 和 CurrencyId 上的覆蓋索引。
您的第二個 LINQ 查詢將使用 SQL 語句,例如SELECT CurrencyId FROM Clients Where Id = 10
假設您擁有涵蓋這些列的索引,它將利用您的索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.