2010-06-25 2 views
1

Я пытаюсь перевести это:SQL Group By значение столбца в LINQ

SELECT IDNum, Max(Convert(varchar(20), (TimeOut - TimeIn), 108)) 
     FROM IO_Times Group by IDNum 
     order by Max(Convert(varchar(20), (TimeOut - TimeIn), 108)) desc"; 

В LINQ в C#. Приведенное выше возвращает список максимального значения (TimeOut-TimeIn), который соответствует каждому уникальному IDNum (для каждого IDNum имеется несколько значений TimeOut-TimeIn).

Вот что я пытаюсь в настоящее время:

from IO_Time in db.IO_Times 
orderby SqlMethods.DateDiffMinute(IO_Time.TimeIn, IO_Time.TimeOut) descending 
group IO_Time by IO_Time.IDNum into list 
select new 
{ 
    ID = list.Key, 
    Time = list 

}); 

Это возвращает правильные идентификаторы в правильном порядке, но «список» содержит все, что в записи базы данных (что имеет смысл). Я также пробовал группу по IDNum и Time, но потом получаю уникальные записи времени и несколько идентификаторов.

Я мог бы сделать цикл foreach и вручную отсортировать все, но я бы действительно не хотел этого делать.

Любые предложения?

ответ

2
from IO_Time in db.IO_Times 
orderby SqlMethods.DateDiffMinute(IO_Time.TimeIn, IO_Time.TimeOut) descending 
group IO_Time by IO_Time.IDNum into list 
select new 
{ 
    ID = list.Key, 
    Time = list.Max(t => t.TimeOut - t.TimeIn) 
} 

И так как вы хотите использовать лямбды чаще:

var results = 
    dbo.IO_Times 
     .OrderByDescending(i => SqlMethods.DateDiffMinutes(i.TimeIn, i.TimeOut)) 
     .GroupBy(i => i.IDNum) 
     .Select(g => new 
      { 
       ID = g.Key, 
       Time = g.Max(t => t.TimeOut - t.TimeIn) 
      }); 
+0

Отлично! Я должен чаще использовать лямбда-операции. –

+0

Очень приятно. Что делать, если я хочу присоединиться к другой таблице с именем, которое совпадает с идентификатором? Я просто попробовал просто присоединиться и надеяться, что Имя появится в intellisense, но это не сработало. –

1
select new 
{ 
    ID = list.Key, 
    Time = list.Max(i => <operation>) 

}); 

Это что вы хотите сделать?