如何通过加入LINQ来获得顶级类别?

时间:2012-05-04 22:20:14

标签: linq entity-framework

我正在开展分类广告项目我面临的问题是获得大多数广告发布的顶级类别每个类别都有子类别。

我提出了查询,但它适用于我想要的子类别广告,如果任何类别没有子类别,则应计算父类别广告。

var result = (from c in db.Category 
              join a in db.Ad on c.CategoryId equals a.CategoryId 
              where c.ParentId != null 
              group c by c.ParentId into g 
              select new { cat = g.Key, a = g.Count() })
                .OrderBy(c => c.cat)
                .OrderByDescending(a => a.a);

我的类别表就像这样

CategoryId ----- ParentId -----姓名

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我想这可以通过单独的查询来完成:

获取没有设置任何parentId的类别列表:

var resultsWithoutSubs = from c in db.Category
             where c.ParentId == null 
               && !result.Any(r => cat == c.CategoryId)
             select c;

根据上面的列表,重复原始查询:

var counts =  from c in resultsWithoutSubs
          join a in dbAd on c.CategoryId equals a.CategoryId
          group c by c.CategoryId into g
          select new {cat = g. Key, a = g.Count};

然后你应该能够将这些列表的第一个和最后一个列表联合起来并对结果进行排序。

答案 1 :(得分:0)

试试这个:

var results = db.Category
    .Join(db.Ad, cat => cat.CategoryId, 
          ad => ad.CategoryId, (cat, ad) => new { cat, ad } )
    .Where (c => !dbCategory
      .Any (d => c.cat.CategoryId == d.ParentId) && c.cat.ParentId == null)
     .GroupBy (c => c.cat.CategoryId) 
     .Select (g => new  
        { cat = g.Key, a = g.Count () } 
);