【问题标题】:Linq to entities - include foreach inside queryLinq 到实体 - 在查询中包含 foreach
【发布时间】:2011-12-02 09:13:48
【问题描述】:

我创建了以下代码:

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”短语并使查询插入字典来缩短代码吗?就像 linq 的某种“into”短语,它告诉查询“将 productName 插入字典的第一个字符串,将 ProductTitle 插入第二个字符串”?

【问题讨论】:

    标签: c# linq linq-to-entities foreach


    【解决方案1】:

    当然可以!您可以在这里找到示例:

    http://www.dotnetperls.com/todictionary

    在你的情况下:

    .ToDictionary(v => v.ProductName, v => v.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);
      

      【讨论】:

      • 只是一个小警告:这将从数据库中选择更多数据(即 tbl_producttype 表的所有列,而不仅仅是 Name 和 TitleName)。在这种情况下可能没有太大区别,但仍然如此。
      • 是的,它确实有所作为,因为有成千上万种产品,谢谢。所以如果我只想取出名称和标题,我应该先取 var 吗,就像我做的那样,然后做 ToDictionary 而不是 foreach ?
      【解决方案3】:

      使用ToDictionary:

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

      【讨论】:

      • 您在上面的第一个答案中写了一条评论,“这将从数据库中选择更多数据”是什么意思,您的意思是 ToDictionary() 不应该在同一个 linq 查询中,只有在我得到'allItemNames'而不是foreach来操作它之后?
      • ToDictionary 存在于“linq-to-objects”世界中(它适用于 IEnumerable,而不适用于 IQueryable)。这意味着在实际创建字典之前,源表中的所有数据都将被提取到内存中。如果您在 ToDictionary 之前保留“选择”,则 linq to 实体可以调整 SQL 语句以仅选择这 2 列。
      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      相关资源
      最近更新 更多