【发布时间】:2011-07-31 16:54:10
【问题描述】:
我有一个问题:
(from sr in ctx.STARS_Route
where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
select sr.DistrictRouteNumber).Distinct();
在 LinqPad 中,查询的运行时间大约为 0.3 秒。 STARS_RouteStopDestination 表中大约有 800K 条记录,但平均返回大约 30-90 条记录。
实际上,从该查询返回结果的方法需要 4 多秒!这没有任何意义。
我唯一能想到的是 .Any 子句花费了很多时间,但 LinqPad 说查询很快。我设置了一个测试(请原谅名称):
using (STARSEntities ctx = new STARSEntities())
{
var Original = (from sr in ctx.STARS_Route
where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
select sr.DistrictRouteNumber).Distinct();
var Entity = (from rsd in ctx.STARS_RouteStopDestination
where rsd.STARS_DistrictRoute.DistrictId == districtId
&& rsd.IsWorkingSet == true
select rsd.STARS_Route.DistrictRouteNumber).Distinct();
DateTime startOriginal = DateTime.Now;
routes = Original.ToList();
Debug.WriteLine("Original took: " + (DateTime.Now - startOriginal).ToString());
DateTime startEtity = DateTime.Now;
routes = Entity.ToList();
Debug.WriteLine("Entity took: " + (DateTime.Now - startEtity).ToString());
}
输出让我大吃一惊:
原始拍摄时间:00:00:04.0270000
实体占用:00:00:00.0200000
为什么带有 .Any 子句的查询需要更长的时间才能运行,为什么 LinqPad 会说原始查询比针对同一数据集的实体查询运行速度略快?
【问题讨论】:
-
如果以相反的顺序执行查询会发生什么?
-
我更喜欢使用 System.Diagnostics 中的
StopWatch类来测量执行时间,而不是 DateTime。 -
反向:实体拍摄:00:00:00.0170000 原始拍摄:00:00:04.0890000
-
如果您使用的是 LinqPad,您应该能够看到生成的 SQL。也许这可以说明一些问题。 IIRC EF 比 L2S 有更好的 SQL 生成。
-
如果您使用的是 LINQPad 生成的模型,那么您使用的是 LINQ to SQL,它生成的 SQL 与实体框架不同(通常更好)。在任何情况下,LINQPad 的 SQL 转换选项卡都应该告诉您正在生成什么 SQL。您还可以在 LINQPad 中连接到您的 EF 模型并进行比较。
标签: linq entity-framework-4 linq-to-entities linqpad