2011-12-02 71 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