使用 LinqToSql,我需要为连接表 (CL) 中的最新 modDate 返回单个 (L)。

表格:
L(盖子,meta1,meta2,...)
CL(Cid、盖子、ModDate)

这是产生预期结果的sql

SELECT l.*
FROM L l
INNER JOIN (
    SELECT TOP 1 cl.Lid, MAX(cl.ModDate) as ModDate
    FROM CL cl
    INNER JOIN L l ON cl.Lid = l.Lid AND l.meta1 = 5
    GROUP BY cl.Lid
    ORDER BY MAX(cl.ModDate) DESC
) As m ON l.Lid = m.Lid

最佳答案

足够简单。子查询将我们转换到 id。查询获取那些具有匹配 ID 的记录。

var subquery = db.L
    .Where(L => L.meta1 = 5)
    .SelectMany(L => L.CLs)
    .GroupBy(CL => CL.Lid)
    .OrderByDescending(g => g.Max(CL => CL.ModDate))
    .Select(g => g.Key)
    .Take(1)

var query = db.L
  .Where(L => subquery.Any(id => L.Lid == id))

进一步思考这一点,您可以摆脱子查询:
var query = db.L
  .Where(L => L.meta1 = 5)
  .SelectMany(L => L.CLs)
  .GroupBy(CL => CL.Lid)
  .OrderByDescending(g => g.Max(CL => CL.ModDate))
  .Select(g => g.First().L);

关于linq - 如何在单个 linq To Sql 语句中使用子查询、分组依据、最大值和顶部?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/502415/

10-13 01:13