我想将以下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
答案 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);
此致
路易斯