将SQL转换为LINQ表达式

时间:2015-02-20 17:14:16

标签: c# .net linq

我想解决一个令人费解的问题。我有一个用户列表(身份表)通过外键与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是最新的)

3 个答案:

答案 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)

Linqer可能会修复它。

请参阅this关于将sql-to-linq转换为

的封闭线程