2015-09-07 4 views
0

Здесь у меня есть выражение лямбды, которое выбирает лучшую шутку по самому высокому рейтингу.Как написать выражение GroupJoin Lambda в запросе Linq?

Таким образом, отношения выглядят так: 1 шутка имеет много оценок.

Лямбда-запрос для выбора лучшей шутки выглядит следующим образом.

Joke best = jokes.GroupJoin(context.Ratings, // DBContext 
          j => j.ID, 
          r => r.JokeID, 
          (j, r) => new { 
              bestJoke = j, 
              sum = r.Sum(s => s.Rating1) 
              }) 
       .OrderByDescending(j => j.sum) 
       .First().bestJoke; 

Я изо всех сил пытаюсь записать это в запрос linq.

Я пробовал до сих пор.

Joke best2 = from j in jokes 
       join r in context.Ratings on j.ID equals r.JokeID 
       group j by j into g 
       select new { 
         bestJoke = j, 
         } ... 

Может ли кто-нибудь помочь мне? Большое спасибо.

ответ

1

GroupJoin могут быть выражены с помощью join .. in .. on .. into синтаксис:

7.16.2.4 From, let, where, join и orderby положения

Выражение запроса с пунктом присоединения с в сопровождаемый select пункт

from x1 in e1 
join x2 in e2 on k1 equals k2 into g 
select v 

переводятся в

(e1) . GroupJoin(e2 , x1 => k1 , x2 => k2 , (x1 , g) => v) 

выражения запроса с объединением п с в последующей нечто иное, чем отборный п

from x1 in e1 
join x2 in e2 on k1 equals k2 into g 
… 

переводятся в

from * in (e1) . GroupJoin(
    e2 , x1 => k1 , x2 => k2 , (x1 , g) => new { x1 , g }) 
… 

Но, как вы можете видеть, вы не можете заставить его генерировать (j, r) => new { bestJoke = j, sum = r.Sum(s => s.Rating1) } в GroupJoin, поэтому вам нужно будет выбрать сумму позже в отдельном выражении.

0

Вы могли бы попробовать что-то вроде этого:

var best2 = (from joke in jokes 
      join rating in context.Ratings 
      on joke.ID equals rating.JokeID 
      group item by joke into gr 
      orderby gr.Sum(x=>x.Rating) descending 
      ).FirstOrDefault(); 

if(best2!=null) 
    bestJoke = best2.Key; 

Однако следует иметь в виду, что приведенный выше запрос во время компиляции будет преобразован в эквивалентный запрос написан в беглом синтаксисом (как и первый) , Синтаксис запроса - это синтаксический сахар, который предлагается нам.

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