SQL / LINQ选择all with group by 2 columns

时间:2012-08-30 16:17:05

标签: sql asp.net-mvc-3 linq sql-server-2008 entity-framework

我试图找到问题的答案,但我不能。 我有ID,WorkerID,Function(int)和DateTime的表。每个工人每天都有多个记录。对于所有工人,我每天只需要获得第一条记录。 此查询提供了我想要的结果:

SELECT WorkerID, MIN(DateTime) AS DateTime
FROM Records
GROUP BY WorkerID, LEFT(DateTime, 10)   
ORDER BY WorkerID

但我想选择所有列(ID,WorkerID,Function和DateTime)。我怎样才能做到这一点? 另外,我需要ASP.NET MVC3应用程序的这个查询,所以如果有人可以在LINQ中为我编写这个,并解释如何将该查询转换为IEnumerable(Record)或IQuerible(Record),我将非常感激。 先谢谢你们,希望你能救我。

编辑:您的LINQ查询有效,但由于使用了大量的视图而不是表格,因此我在性能方面遇到了很多问题。现在我切换到Table,我想直接在Table上进行查询。结构是一样的,只是代替WorkerID,我有ETAG,这是相同的。但我现在有问题。上面提到的SQL查询,在表上给我大约50k的结果,这是正确的,但是现在你的LINQ查询只给我9k,所以出了点问题。这是查询:

from d in Records
group d by new { d.ETAG, Date = d.DateTime.Value.Year + d.DateTime.Value.Month +            d.DateTime.Value.Day } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()

拜托,能帮帮我这个......

1 个答案:

答案 0 :(得分:1)

from r in Records
group r by new { WorkerId = r.WorkerId, Date = r.DateTime.Value.Date } into g
orderby g.Key.WorkerId
select g.OrderBy(e => e.DateTime).First()

更新:添加了orderby子句,并使用g.OrderBy()强制选择每天的第一条记录,而不是组中的任意元素。