【问题标题】:Linq query not compilingLinq 查询未编译
【发布时间】:2018-12-13 14:25:41
【问题描述】:

我写了一个小 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 子句之后重用 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

【问题讨论】:

  • 您的 linq 的 group by 与 SQL 不对应。您正在对联接结果进行分组。

标签: c# sql .net linq


【解决方案1】:

正如我在评论中提到的,您的 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),则需要注意大量分配。

【讨论】:

    【解决方案2】:

    尝试以下:

    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();
    

    【讨论】:

    • sql不一样
    • 您需要提供更多详细信息以避免对 jdweng 投反对票。你有 16.6k 点。我相信你知道如何在 SO 标准内回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多