这是我的SQL表:
我
d person datetime status description1 description2
----------- -------------------- ----------------------- ---------- --------------- ---------------
1 personA 2010-01-01 20:00:00.000 A desc1 desc2
2 personA 2010-01-01 21:00:00.000 B desc3 desc4
3 personA 2010-01-01 19:00:00.000 A desc5 desc6
4 personB 2010-01-01 20:00:00.000 A desc7 desc8
5 personB 2010-01-01 21:00:00.000 A desc9 desc10
7 personB 2010-01-01 18:00:00.000 NULL desc11 desc12
8 personB 2010-01-02 19:00:00.000 A desc13 desc14
9 personB 2010-01-02 20:00:00.000 A desc15 desc16
我正在使用实体框架并尝试创建一个LINQ查询,该查询返回状态不等于“null”的每个人最早的日期时间值的所有数据(所有列)。对于当前数据集,它应返回id(3,4,8)
的行SQL查询将是这样的:
SELECT A.*
FROM MyTable A
INNER JOIN ( SELECT person, Min([datetime]) as mindate
FROM MyTable
WHERE [status] is not null
GROUP BY person, convert(date, [datetime])) B
on A.person = B.person
and A.datetime = B.mindate
我如何在LINQ中表达这一点?除了整个查询之外,我还在努力解决日期时间列允许空值(未在示例数据集中显示)的事实。这使得enityframework创建了一个可空类型DateTime的属性?这进一步使我的LINQ查询复杂化。
提前致谢!
答案 0 :(得分:0)
这可能不是最有效的LINQ,但可以做到你想要的:
var query =
from person in MyTable
let dates = from p in MyTable where p.Person == person.Person && p.Status != null orderby p.DateTime select p
let earliest = dates.First()
group earliest by earliest.Person into grouped
select grouped.First();
并且很容易添加代码来处理可以为空的日期,具体取决于你想用它做什么。