C# Linq查询未编译
我编写了一个小的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
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分。我相信你知道如何在标准范围内回答。