2

我有一个查询:

(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 会说原始查询比针对同一数据集的实体查询运行得稍快一些?

4

1 回答 1

0

您只是对两个不同的对象进行操作,它们有两种不同的策略来获得结果。LINQPad 生成一个 LINQ to SQL 模型,并将您的代码注入到具有此模型范围内的方法中。

您的 STARSEntities 类属于不同类型,并且可能与数据库具有完全不同的交互。

LINQPad 有自己的视图来显示正在运行的 SQL。您应该将其与 EF 模型正在执行的 SQL 进行比较。这会在您执行时显示在 SQL Server Profiler 中。

于 2011-07-31T08:54:10.820 回答