我想解决一个令人费解的问题。我有一个用户列表(身份表)通过外键与Sessions表相关(1到0 /多)
我要做的是为用户找到最近的已关闭会话。通常我先找出SQL,然后尝试转换为LINQ。我是LINQ专家的FAR,我最新的询问给了我适合。
这是我正在使用的SQL。
IdentityId是Identities表中的PK - Sessions表中的FK
select s.* from Identities i
join Session s on s.IdentityID = i.IdentityID
where s.ID in
(select top 1 ID from Session a
where a.IdentityID = s.IdentityID
order by a.CreateDate desc
)
这给了我我想要的东西;每个标识行的1个会话行AND,它是最近的会话(CreateDate是最新的)
答案 0 :(得分:0)
认为你想要一个LET子句。尝试类似:
from s in Session
group s by s.IdentityId into grp
let MaxSession = grp.Max(o => o.CreateDate)
from i in Identities
join s in grp on { i.IdentityId, MaxSession } equals { s.SessionId, s.CreateDate }
select i, s
答案 1 :(得分:0)
如果我没弄错的话,可以按如下方式重写SQL查询:
SELECT s.*
FROM Session s
Join
(
SELECT IdentityId, MAX(CreateDate) as CreateDate
FROM Session
GROUP BY IdentityId
) a ON a.IdentityId = s.IdentityId
...可以用LINQ方法语法编写:
sessions.GroupBy(s => s.ID)
.Select(g => g.OrderByDescending(a => a.CreateDate).First());
答案 2 :(得分:-2)