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

結果を取得するための2つの異なる戦略を持つ2つの異なるオブジェクトに作用しているだけです。LINQPadは、LINQ to SQLモデルを生成し、このモデルをスコープ内に持つメソッドにコードを挿入します。

STARSEntitiesクラスは異なるタイプであり、データベースとの相互作用が完全に異なる可能性があります。

LINQPadには、実行中のSQLを表示する独自のビューがあります。EFモデルによって実行されているSQLと比較する必要があります。これは、実行時にSQLServerプロファイラーに表示されます。

于 2011-07-31T08:54:10.820 に答える