幫助

2010-09-15 104 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(); 

,並很容易添加代碼來處理可空的日期,這取決於你想用它做什麼。