我有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/