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

C# 嵌套linq查询,如何获得不同的值?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,表2“类别”和“子类别”列的数据 我想得到一组“类别”[子类别] 使用下面的代码,我得到了副本。在外部“from”后面加上.Distinct()并没有多大帮助。我错过了什么 var rootcategories = (from p in sr.products orderby p.category select new

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

我想得到一组“类别”[子类别] 使用下面的代码,我得到了副本。在外部“from”后面加上.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);
现在也许是时候考虑一下什么是正确的问题了。。(:

我认为您需要两个“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()
    };

您的主要查询是关于产品的,因此您将获得每个产品的记录。切换它,以便您在类别上查询,但在产品上过滤。类别Distinct()背后的算法需要一种方法来判断源IEnumerable中的两个对象是否相等。 默认方法是通过引用比较两个对象,因此可能没有两个对象是“相等”的,因为您使用“new”关键字创建它们

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

用这段代码解决

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

                               select subcats);
谢谢大家