2

我有一个大问题。我不知道我的 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 的结果。出了点问题,但我想不出是什么。请帮我解决这个问题...在此先感谢

4

2 回答 2

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()

编辑

不幸的是,由于实体框架的限制,上述查询将不起作用(即使它在 LINQ to SQL中有效)。事实上,使用实体框架进行 SQL 查询并没有有效的并行。使用 LINQ 表达式获得所需输出的唯一选择是.ToList()在分组和转换它们之前使用 a 捕获所有记录。不理想,但它会工作。

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()
于 2012-09-05T18:20:24.040 回答
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();

参考:http ://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/cb58ae5f-5db9-4054-92b6-a1bf63764574/

于 2012-09-05T21:59:20.940 回答