首页 > 解决方案 > 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 available
             select data.Id).Count(); // data variable not available

我的问题是我不能在子句之后重用数据变量。group by我怎样才能做到这一点?

有关信息,这是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

标签: c#sql.netlinq

解决方案


正如我在评论中提到的,您的 linq 查询的顺序group byjoin您的 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-to-objects),则需要注意大量分配。


推荐阅读