2015-09-07 119 views
0

在這裏,我有一個lambda表達式,它選擇最高級別的最佳笑話。如何在Linq查詢中編寫GroupJoin Lambda表達式?

所以這種關係看起來像這樣:1個笑話有很多評分。

選擇最佳笑話的lambda查詢如下。

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 Fromletwherejoinorderby子句

的查詢表達式與連接子句與入後跟一個 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) 

的查詢表達式與連接子句與成隨後通過除select子句其他 東西

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; 

然而,你應該記住,在編譯時上面的查詢將被轉換爲寫流利的語法等效查詢(如第一個) 。查詢語法是提供給我們的語法糖。