2016-08-16 267 views
0

我有一个表在我的数据库中有一个日期字段(VisitDate)。当我执行下面的SQL查询,我收到1秒结果:GroupBy()运行非常缓慢

select year(VisitDate), month(visitDate) 
from GABrowser 
group by year(VisitDate), month(visitDate) 

然而,在我的ASP.Net代码(在Visual Basic),后续需要12秒,执行:

Dim stats = db.GABrowsers.GroupBy(Function(s) New With {s.VisitDate.Value.Year, s.VisitDate.Value.Month}) 

'(Takes 12 seconds to enter in the For loop) 
For Each stat In stats 

Next 

我不知道为什么需要这么长时间。这会导致我的网页加载速度非常慢。

+0

必须查看SQL Server实际在做什么。你可以运行SQL分析器来查看你的应用程序发送到SQL Server的哪些命令?然后,你会看到什么是运行和多久。 –

+0

为VisitDate创建聚簇索引并将您的SQL查询与EF Profiler相关 –

+0

我从来没有听说过SQL分析器。我在哪里运行? – AskYous

回答

3

SQL查询和LINQ查询不等价。

SQL查询只返回year(VisitDate)month(visitDate)。 LINQ中的GroupBy虽然不同,但它会返回完整实体,它们按分组条件分组。

在LINQ结果中,您将看到db.GABrowsers实体处于相同的s.VisitDate.Value.Years.VisitDate.Value.Month组中。您会看到LINQ语句生成的SQL查询比第一个SQL查询更宽(在字段中)。

除此之外(更大的SQL结果集),EF需要时间来处理数据库中的数据并实现实体对象。

+1

我认为这将是有用的,如果你张贴等效的LINQ查询。 – Enigmativity

+1

只需在查询结尾处添加'.Select(Function(g)g.Key)'。 –

+0

@IvanStoev不知道OP实际上是否需要LINQ语句的相同结果,或者他们是否尝试了SQL语句*,假设它是等价的。看看'For'循环中会发生什么会很有趣。当然,如果他们想重现SQL结果,选择'Key'就可以做到。 –