【问题标题】:nested linq queries, how to get distinct values?嵌套的 linq 查询,如何获得不同的值?
【发布时间】:2008-11-09 17:26:38
【问题描述】:

“类别”和“子类别”两列的表格数据

我想获得“类别”的集合,[子类别] 使用下面的代码我得到重复。将 .Distinct() 放在外部“来自”之后并没有多大帮助。我错过了什么?

 var rootcategories = (from p in sr.products
                                 orderby p.category
                                  select new
                                  {
                                      category = p.category,
                                      subcategories = (
                                      from p2 in sr.products
                                      where p2.category == p.category
                                      select  p2.subcategory).Distinct()
                                  }).Distinct();

sr.products 看起来像这样

category   subcategory
----------------------
cat1       subcat1
cat1       subcat2
cat2       subcat3
cat2       subcat3

我得到的结果是

cat1, [subcat1,subcat2]
cat1, [subcat1,subcat2]

但我只想要一个条目

用这段代码解决了我的问题:

   var rootcategories2 = (from p in sr.products
                               group p.subcategory by p.category into subcats

                               select subcats);

现在也许是时候想想什么是正确的问题了.. (-:

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    用这段代码解决了

       var rootcategories2 = (from p in sr.products
                                   group p.subcategory by p.category into subcats
    
                                   select subcats);
    

    谢谢大家

    【讨论】:

      【解决方案2】:

      我认为您需要 2 个“Distinct()”调用,一个用于主要类别,另一个用于子类别。

      这应该适合你:

      var mainCategories = (from p in products select p.category).Distinct();
      
      var rootCategories =
          from c in mainCategories
          select new {
              category = c,
              subcategories = (from p in products
                               where p.category == c
                               select p.subcategory).Distinct()
          };
      

      【讨论】:

        【解决方案3】:

        Distinct() 背后的算法需要一种方法来判断源 IEnumerable 中的 2 个对象是否相等。 默认方法是通过引用比较 2 个对象,因此很可能没有 2 个对象是“相等”的,因为您使用“new”关键字创建它们。

        您要做的是编写一个实现 IEnumerable 的自定义类并将其传递给 Distinct() 调用。

        【讨论】:

          【解决方案4】:

          您的主要查询是关于产品的,因此您将获取每个产品的记录。切换它,以便您查询类别,但过滤 Product.Category

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多