SQL Group By значение столбца в LINQ - PullRequest
1 голос
/ 25 июня 2010

Я пытаюсь перевести это:

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 (существует несколько значений TimeOut-TimeIn для каждого IDNum).

Вот что я пытаюсь сейчас:

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 ]

2 голосов
/ 25 июня 2010
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)
}

И так как вы хотите использовать Lambdas чаще:

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)
            });
1 голос
/ 25 июня 2010
select new
{
  ID = list.Key,
  Time = list.Max(i => <operation>)

});

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

...