C# Linq查询未编译

C# Linq查询未编译,c#,sql,.net,linq,C#,Sql,.net,Linq,我编写了一个小的linq查询,目前还没有编译 var count = (from data in Data join data2 in Data on data.UserId equals data2.UserId group data2 by data2.UserId into gr where gr.Max(b => b.Date) == data.Date // data variable not ava

我编写了一个小的linq查询,目前还没有编译

var count = (from data in Data
             join data2 in Data on data.UserId equals data2.UserId
             group data2 by data2.UserId into gr
             where gr.Max(b => b.Date) == data.Date  // data variable not available
             select data.Id).Count(); // data variable not available
我的问题是,我不能在
GROUPBY
子句之后重用data变量。我怎样才能做到这一点

作为参考,这是我试图转换的
SQL
查询

SELECT COUNT(data.Id)
FROM Data data
INNER JOIN
    (SELECT UserId, MAX(Date) AS MaxDate
     FROM Data
     GROUP BY UserId) g
ON data.UserId = g.UserId
AND data.Date = g.MaxDate
请尝试以下操作:

var max = (from data in Data
             join data2 in Data on data.UserId equals data2.UserId
             select new {data = data, data2 = data2})
             .GroupBy(x => x.data2.UserId)
             .Select(x => x.Max(b => b.data2.Date))
             .ToList();

正如我在评论中提到的,linq查询中
groupby
join
的顺序与SQL查询不匹配

如果您喜欢查询语法,您的查询可以如下所示:

(from d in Data
join g in
    (from d in Data
    group d by d.UserId
    into gr
    select new { UserId = gr.Key, MaxDate = gr.Max(d => d.Date) })
on new { ID = d.UserId, Date = d.Date} equals new { ID = g.UserId, Date = g.MaxDate }
select d.Id)
.Count();

但是它非常丑陋而且太复杂了。如果要在内存中执行此操作(linq到对象),则需要注意大量分配。

您的linq的
分组依据
与SQL不对应。您正在对连接结果进行分组。这与
sql
不同,您需要提供更多详细信息,以避免降级。你有16.6k分。我相信你知道如何在标准范围内回答。