4

我使用Enumerable.ToDictionary創建一個字典掀起了LINQ呼叫:Enumerable.ToDictionary僅檢索它需要的內容嗎?

return (from term in dataContext.Terms 
     where term.Name.StartsWith(text) 
     select term).ToDictionary(t => t.TermID, t => t.Name); 

將這一號召取每學期的全部,還是會只從我的數據檢索TermID和名稱字段供應商?換句話說,我會被保存自己的數據庫流量,如果我寫的,而不是像這樣:

return (from term in dataContext.Terms 
     where term.Name.StartsWith(text) 
     select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name); 

回答

5

Enumerable.ToDictionary工作在IEnumerable的對象。您的聲明的第一部分「(from ... select term」)是一個IQueryable對象。 Queryable將查看錶達式並構建SQL語句。然後將它轉換爲IEnumerable傳遞給ToDictionary()。

換句話說,是的,你的第二個版本會更有效率。

1

ToDictionaryIEnumerable<T>IQueryable<T>的擴展方法。它不需要Expression<Func<T, TKey>>,而只需要一個Func<T, TKey>,它會盲目地調用每個項目。它不關心(也不知道)關於LINQ和底層表達式樹和類似的東西。它只是迭代序列並建立一個字典。因此,在您的第一個查詢中,所有列都被提取。

3

生成的SQL將返回整個術語,所以您的第二條語句將會降低您所需的。

您可以設置dataContext.Log = Console.Out並查看不同的查詢結果。

使用我的樣本LINQPad數據庫,這裏有一個例子:

var dc = (TypedDataContext)this; 

// 1st approach 
var query = Orders.Select(o => o); 
dc.GetCommand(query).CommandText.Dump(); 
query.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump(); 

// 2nd approach 
var query2 = Orders.Select(o => new { o.OrderID, o.OrderDate}); 
dc.GetCommand(query2).CommandText.Dump(); 
query2.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump(); 

生成的SQL是(或者只是偷看LINQPad的SQL選項卡):

// 1st approach 
SELECT [t0].[OrderID], [t0].[OrderDate], [t0].[ShipCountry] 
FROM [Orders] AS [t0] 

// 2nd approach 
SELECT [t0].[OrderID], [t0].[OrderDate] 
FROM [Orders] AS [t0]