如何在Linq查询中编写GroupJoin Lambda表达式

本文关键字:GroupJoin Lambda 表达式 Linq 查询 | 更新日期: 2023-09-27 18:11:31

这里我有一个lambda表达式,它根据最高评分选择最佳笑话。

所以关系是这样的:一个笑话有很多评分。

选择最佳笑话的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,
                      } ...
有谁能帮我一下吗?非常感谢。

如何在Linq查询中编写GroupJoin Lambda表达式

GroupJoin可以用join .. in .. on .. into语法表示:

7.16.2.4 From, let, where, join, orderby子句

带有连接子句的查询表达式,子句后面跟着intoselect子句

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 )

带有连接子句的查询表达式,后面跟着into非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调用,所以你必须在单独的表达式中选择总和。

你可以尝试这样做:

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;
但是,您应该记住,在编译期间,上面的查询将被转换为用流畅语法编写的等效查询(如第一个查询)。查询语法是提供给我们的语法糖。