2010-06-25 60 views
1

我试图把这种SQL集团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#。以上返回与每个唯一IDNum(每个IDNum有多个TimeOut-TimeIn值)相对应的(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,但“清单”包含在数据库条目中的一切(这是有道理的)。我也尝试了IDNum和Time组,但是我得到了唯一的时间条目和多个ID返回。

我可以做一个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) 
} 

而且因为你想更频繁地使用Lambda表达式:

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

完美!我应该更频繁地使用lambda操作。 – 2010-06-25 17:35:33

+0

非常好。如果我想加入另一张名称与ID一致的表,该怎么办?我只是简单地加入并希望名称能够在intellisense中显示,但它不起作用。 – 2010-06-25 17:57:36

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

}); 

这就是你想要做的吗?