我遇到了一个很大的问题。我无法弄清楚我的LINQ查询有什么问题。这是完成工作的SQL查询:
SELECT TOP (100) PERCENT MIN(DateTime) AS DateTime, ETAG
FROM dbo.Table
GROUP BY ETAG, LEFT(DateTime, 10)
ORDER BY ETAG
此查询在执行时为我提供了大约50k的结果。我想在LINQ中使用相同的内容。这是我试过的:
from d in Table
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()
执行此操作时,只需几分钟即可完成,并为我提供了大约9k的结果。有些事情是错的,但我无法弄清楚是什么。拜托,帮我搞定...... 提前致谢
答案 0 :(得分:1)
根据您的两个查询,LINQ语句中的group by根本不同,因为您没有按实际日期分组,而是分组年,月和日的整数。
相反,试试这个:
from d in Table
group d by new { d.ETAG, Date = date.DateTime.Value.Date } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()
击> <击> 撞击>
修改强>
不幸的是,由于Entity Framework的限制,上述查询将无效(即使 在LINQ to SQL中有效)。实际上,使用Entity Framework与您的SQL查询没有高效并行。使用LINQ表达式获取所需输出的唯一选择是在分组和转换它们之前捕获具有.ToList()
的所有记录。不理想,但它会起作用。
from d in Table.ToList()
group d by new { d.ETAG, Date = date.DateTime.Value.Date } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault()
答案 1 :(得分:0)
使用.NET 4或更高版本,Entity Framework提供了几个专门用于日期值的实用程序功能。这可以帮助您克服第一个示例的障碍,并防止您在分组之前必须急切加载所有行。
from d in Table
group d by new { d.ETAG, Date = EntityFunctions.TruncateTime(d.DateTime) } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault();
修改强>
或者,如果您的目标是仅按字段的日期部分进行分组,则可以尝试:
from d in Table
let dt = d.DateTime
group d by new { d.ETAG, y = dt.Year, m = dt.Month, d = dt.Day } into g
orderby g.Key.ETAG
select g.OrderBy(e => e.DateTime).FirstOrDefault();