帮助

2010-09-15 160 views
1

这是我的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查询,返回的所有数据(所有列)为最早每个人的状态不等于'空'的日期时间值。对于当前的数据集,它应该返回行的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

这可能不是最有效的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(); 

,并很容易添加代码来处理可空的日期,这取决于你想用它做什么。