2010-09-15 5 views
1

Это мой SQL таблицы:Помощь требуется на Linq запрос

я

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, который возвращает все данные (все столбцы) для самых ранних datetime на человека, где статус не равен «null». Для текущего набора данных он должен возвращать строки для идентификатора (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? Помимо запроса в целом я боролся с тем, что столбец datetime допускает нулевые значения (не показаны в наборе данных примера). Это приводит к тому, что enityframework создает свойство NULL-типа 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(); 

и достаточно просто добавить код для обработки обнуляемой даты, в зависимости от того, что вы хотите с ним делать.