2011-12-02 81 views
1

的foreach我創建了下面的代碼:LINQ到實體 - 包括內部查詢

Dictionary<string, string> allItemNames = new Dictionary<string, string>(); 


var productNames = from product in entities.tbl_producttype 
           select new { ProductName = product.Name, ProductTitle = product.TitleName }; 

      foreach (var productName in productNames) 
      { 
       allItemNames.Add(productName.ProductName, productName.ProductTitle); 
      } 

它的偉大工程,但我可以做短通過刪除「的foreach」語句的代碼,使查詢執行INSERT INTO詞典?就像linq的一個'into'短語,它告訴查詢「將productName插入字典的第一個字符串,並將ProductTitle插入到第二個字符串中」?

回答

2

它可能會混淆代碼以在查詢時進行修改。您當前的實現易於閱讀並表達循環的意圖。因此,Enumerable沒有辦法做到這一點。

List上,您可以使用ForEach方法,但最簡潔的方法是使用LINQ ToDictionary method

var productNames = 
from product in entities.tbl_producttype 
    select new { ProductName = product.Name, ProductTitle = product.TitleName }; 
var allItemNames = 
productNames 
    .ToDictionary(product => product.ProductName, product => product.ProductTitle); 
+1

只是一個小警告:這會從數據庫中選擇更多的數據(即,tbl_producttype表的所有列,而不僅僅是Name和TitleName)。在這種情況下可能沒有太大的區別,但依然如此。 – jeroenh

+0

是的,它確實有所作爲,因爲有成千上萬的產品,謝謝。所以如果我只想取出名稱和標題,我應該先採用var,就像我做的那樣,然後做ToDictionary而不是foreach? – Rodniko

+0

@Rodniko代碼現在已更新。 –

1

使用ToDictionary

allItemNames = productNames.ToDictionary(p => p.Name, p => p.ProductTitle) 
+0

你在上面的第一個答案中寫了一條評論,你是什麼意思「這將從數據庫中選擇更多的數據」你的意思是ToDictionary()不應該在同一個linq查詢中,只有在我得到'allItemNames '來操作它而不是foreach? – Rodniko

+1

ToDictionary存在於'linq-to-objects'世界中(它適用於IEnumerable,而不是IQueryable)。這意味着在實際創建字典之前,源表中的所有數據都會被提取到內存中。如果您在ToDictionary之前放置'select',則linq to實體可以調整SQL語句以僅選擇這2列。 – jeroenh

+0

非常感謝 – Rodniko