2015-09-07 120 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; 

然而,你应该记住,在编译时上面的查询将被转换为写流利的语法等效查询(如第一个) 。查询语法是提供给我们的语法糖。