我的EF查询有什么问题?

时间:2012-09-05 18:14:50

标签: c# .net linq entity-framework linq-to-entities

我遇到了一个很大的问题。我无法弄清楚我的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的结果。有些事情是错的,但我无法弄清楚是什么。拜托,帮我搞定...... 提前致谢

2 个答案:

答案 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();

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