2014-10-21 2 views
0

Я хочу преобразовать следующий запрос SQL Query в запрос Entity Framework + LINQ. Есть три таблицы Бренды, Продукты и ProductReviews. Таблица продуктов имеет BrandId как FK, а ProductReviews имеет ProductId как FK.Как использовать LINQ Group с подсчетом

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

если вы нашли полезный ответ его рекомендуют принимать ответ, так что пользователи будут рекомендуется отвечать на другие вопросы. – HaBo

ответ

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

Спасибо @HaBo, ваш псевдокод очень помог мне в решении моей проблемы. – Waqas

0

Это действительно зависит от того, как ваша модель установки с EF. Если вы добавили отношения в вашей модели, запрос может быть столь же просто, как

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

Потому что вы ничего от продукта не выбирая, я не включая его в запросе. Если у вас есть отношения в EF, мы сможем использовать навигационные свойства, такие как x.Brand.Someproperty, а EF будет обрабатывать создание запроса на основе модели, которую вы установили.

переменная результата будет содержать запрос, и как только вы получите доступ к значениям, запрос будет выполнен. И, наконец, чтобы выбрать только верхний 5 вы бы просто использовать функцию Take как так

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

С уважением

Луи

+0

Вопрос запрашивает выражение Group By. В вашем примере не будет Group By. – HaBo

+0

Извините, мой плохой, я думал, что человек хочет перенести код с SQL на Linq, и вместо поиска 100% -ного совпадения кода он скорее хотел получить тот же результат, просто используя Linq и EF. Кроме того, итоговый sql моего запроса имеет меньше объединений, чем ваш, и на самом деле выполняется немного быстрее в результате этого, поскольку одна строка, легко читаемая и воспроизводимая, все еще имеет смысл для меня, она также отлично использует то, что EF и Linq может предложить. Чтобы процитировать вопросника: «Мне нужны выходы, как показано ниже» –

Смежные вопросы