如何使用LINQ Group By with Count

时间:2014-10-21 18:26:41

标签: linq entity-framework group-by

我想将以下SQL查询转换为Entity Framework + LINQ查询。品牌,产品和产品评论有三个表。 Products表的BrandId为FK,ProductReviews的ProductId为FK。

SELECT Top 5 b.Id, b.ShortName, COUNT(r.Id) AS TotalReviews
FROM ProductsReviews r 
INNER JOIN Products p ON r.ProductId = p.Id
INNER JOIN Brands b ON p.BrandId = b.Id
GROUP BY b.Id, b.ShortName
Order By TotalReviews desc 

基本上,我希望根据这些品牌产品的评论显示前5个品牌。我想要输出如下:

Id    ShortName         TotalReviews 
-----------------------------------------
76    Adidas            61
120   Yamaha            29
109   Tommy Hilfiger    26
61    Mothercare        25
31    Haier             22

2 个答案:

答案 0 :(得分:1)

伪代码

var results = 
     ( from r in ProductsReviews 
       join p in Products  on r.ProductId equals p.Id
       join b in Brands  on p.BrandId equals b.Id
       group c by new { 
                   b.Id, 
                   b.ShortName } into grp
       select new {
                   Id = grp.key.Id, 
                   ShortName = grp.key.ShortName, 
                   TotalReviews = grp.Count()}
     )
    .OrderBy(x=>x.TotalReviews).Take(5);

答案 1 :(得分:0)

这实际上取决于您使用EF设置模型的方式。 如果您在模型中添加了关系,则查询可以像

一样简单
var result = context.ProductReviews.OrderByDescending(x => x.TotalReviews).Select(x => new { x.BrandId, X.Brand.ShortName, x.TotalReviews});

因为您没有从Product中选择任何内容,所以我不会将其包含在查询中。如果您在EF中有关系,我们将能够使用x.Brand.Someproperty等导航属性,EF将根据您设置的模型处理创建查询。

结果变量将包含查询,一旦您访问这些值,查询就会被执行。最后,只选择前五名,你就可以像这样使用Take函数

var result = context.ProductReviews.OrderByDescending(x => x.TotalReviews).Select(x => new { x.BrandId, X.Brand.ShortName, x.TotalReviews}).Take(5);

此致

路易斯