C# 将SQL转换为LINQ表达式

C# 将SQL转换为LINQ表达式,c#,.net,linq,C#,.net,Linq,我正试图解决一个令人费解的问题。我有一个通过外键与会话表(1到0/多)相关的用户列表(标识表) 我要做的是为用户查找最近关闭的会话。通常,我先找出SQL,然后尝试将其转换为LINQ。我远不是LINQ方面的专家,我最近的问题让我感到很不舒服 下面是我正在使用的SQL IdentityId是Identities表中的PK-会话表的FK select s.* from Identities i join Session s on s.IdentityID = i.Id

我正试图解决一个令人费解的问题。我有一个通过外键与会话表(1到0/多)相关的用户列表(标识表)

我要做的是为用户查找最近关闭的会话。通常,我先找出SQL,然后尝试将其转换为LINQ。我远不是LINQ方面的专家,我最近的问题让我感到很不舒服

下面是我正在使用的SQL

IdentityId是Identities表中的PK-会话表的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个会话行,并且它是最近的会话(CreateDate是最近的)

认为需要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
可能会修好的


请参阅closed thread about converting sql to linq。

如果我没有弄错,您的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());

您的类是什么样子的?我将结果选择到DTO类中,以便向客户端返回.AsQueryable。不幸的是使用Silverlight。。。我的select语句而不是select*将选择新的IdentityLastLogin_DTO{IdentityID=i.IdentityID,IdentityName=i.LastName+“,”+i.FirstName,LastLogin=s.CreateDate,LastLoginEndDate=s.EndDate!=null?s.EndDate:null,LastMachine=s!=null?s.ClientHostname:null})抱歉-在我完成之前按Enter键…“这正是我想要的”-我看不到问题,甚至是一个问题。也许可以添加一个问题描述或实际问题..我的问题是它需要在LINQ中,而我不太擅长LINQ。我可以做基本的选择和筛选,但这种类型的子选择远远超出了我的专业知识。