LINQ中的SQL Group By列值

时间:2010-06-25 17:02:44

标签: c# asp.net sql linq-to-sql

我想翻译一下:

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";

进入C#中的LINQ。以上返回与每个唯一IDNum对应的(TimeOut-TimeIn)的最大值列表(每个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

});

这将以正确的顺序返回正确的ID,但“list”包含数据库条目中的所有内容(这是有意义的)。我也尝试过IDNum和Time的分组,但后来我得到了唯一的时间条目和多个ID。

我可以做一个foreach循环并手动排序,但我真的不愿意这样做。

有什么建议吗?

2 个答案:

答案 0 :(得分: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)
}

因为你想更频繁地使用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 :(得分:1)

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

});

这就是你想要做的吗?