我有2条基本上执行相同操作的SQL语句,即基于一组记录的datetime字段从表中检索最后一条记录。我正在使用数据优先的实体框架模型。如何使用LINQ Lambda函数编写这些SQL语句中的任何一个?



var u = db.AccessCodeUsage.Where(...).GroupBy(...)


而不是

var u = from a in db.AccessCodeUsage
        where ...
        group by ...


SQL语句:

SELECT  *
FROM    AccessCodeUsage a
WHERE   NOT EXISTS (SELECT  1
                    FROM    AccessCodeUsage
                    WHERE   LocationId = a.LocationId
                    AND     Timestamp > a.Timestamp)

SELECT    a.*
FROM    AccessCodeUsage a
WHERE   a.Timestamp =
        (SELECT MAX(Timestamp)
        FROM    AccessCodeUsage
        WHERE   a.LocationId = LocationId
        AND     a.AccessCode = AccessCode
        GROUP   By LocationId, AccessCode)

最佳答案

如果您需要方法调用表单,但发现要计算起来很麻烦,那么请首先使用其他语法:

from a in db.AccessCodeUsage
  orderby a.TimeStamp descending
  group a by a.LocationId into grp
  from g in grp select g.First();


然后通过一次使每个子句转换为方法调用:

db.AccessCodeUsage
  .OrderByDescending(a => a.TimeStamp)
  .GroupBy(a => a.LocationId)
  .Select(g => g.First());


从中我可以进行第二次锻炼而无需费心先写出linq语法形式:

db.AccessCodeUsage
  .OrderByDescending(a => a.TimeStamp)
  .GroupBy(a => new {a.LocationId, a.AccessCode})
  .Select(g => g.First());


(除非它不包括可能是错误的错误,否则,如果不能保证时间戳的唯一性,问题中给出的SQL可能会包含一些额外的不合适结果)。

我目前无法检查产生的SQL,但希望它的结果应该相同(如果不一定匹配)。在某些情况下,分组不能很好地转换为SQL,但我当然不认为这会是一种。

关于c# - 如何编写linq语句以获取一组记录中的最后一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11995228/

10-17 01:35