代码之家  ›  专栏  ›  技术社区  ›  Alexander Taran

嵌套linq查询,如何获得不同的值?

  •  5
  • Alexander Taran  · 技术社区  · 18 年前

    表2“类别”和“子类别”列的数据

    我想得到一组“类别”[子类别]

     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);
    

    现在也许是时候考虑一下什么是正确的问题了。。(-:

    4 回复  |  直到 18 年前
        1
  •  5
  •   Alexander Taran    18 年前

    用这个代码解决

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

    谢谢大家

        2
  •  3
  •   chakrit Dutchie432    18 年前

    我认为您需要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
  •  2
  •   user35959    18 年前

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

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

        4
  •  1
  •   GeekyMonkey    18 年前

    您的主要查询是关于产品的,因此您将获得每个产品的记录。切换它,这样您就可以查询类别,但可以根据Product.Category进行过滤