如何在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,
} ...
有谁能帮我一下吗?非常感谢。
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;
但是,您应该记住,在编译期间,上面的查询将被转换为用流畅语法编写的等效查询(如第一个查询)。查询语法是提供给我们的语法糖。