2017-04-20 10 views
0

ASP.NET MVCアプリケーションでEntity Frameworkを使用していますが、LINQ経由でSQL Serverからデータを読み込む際に問題が発生しています。私のクエリは結果を4秒で返しますが、より良い解決策を探しています。ここで Entity Framework Linqクエリの実行時間を短縮する方法は?

は私のLINQクエリです:

var user = 
    context.CreateObjectSet<DAL.ProductMaster>() 
     .AsNoTracking() 
     .Include("Product1").AsNoTracking() 
     .Include("Product2").AsNoTracking() 
     .Include("Product3").AsNoTracking() 
     .Include("Product4").AsNoTracking() 
     .Include("Product5").AsNoTracking() 

     .Where(x => x.Id == request.Id) 
     ).FirstOrDefault(); 
+5

エンティティを少なく読み込もうとしましたか? – Marco

+0

IdおよびOrganizationIdに索引を作成したかどうかを確認してください。インデックスはこの状況をスピードアップすることができます。 – Tony

+3

他のテーブルやデータのうち_ALL_が必要なことは確かですが、JOIN操作が非常に多く生成されるため、高価になる可能性があります。さらに、 'Where()'句を 'FirstOrDefault()'に置き換えることで、少しだけ整理することができます。また、それぞれのInclude()に 'AsNoTracking()'コールを必要としない可能性もあります。 –

答えて

0

だけにして最初のいずれかを選択するWhere()に述語を満たす複数のエンティティを取得する必要はありません。単にFirstOrDefault()と直接電話してください。

if (request == null || organizationsList == null || !organizationsList.Any()) 
    return; 

var user = context.CreateObjectSet<DAL.User>() 
        .AsNoTracking() 
        .Include("UsersinPrograms.FollowUps") 
        .Include() ... 
        .FirstOrDefault(x => x.Id == request.userId && organizationsList.Contains(x.OrganizationId))); 

また、あなたが必要としないInclude()年代を削除します。

+0

コードのおかげで、私の以前の結果と同じ結果を得るのは大変です。 – Surendar

+0

'context.CreateObjectSet ().AsNoTracking()' ...は奇妙に思えますが、 'context.Users..AsNoTracking()' ...のようなものは必要ありませんか?あなたは既に作成されているはずのユーザーで、既存のデータを照会/フィルタリングしています(新しいデータセットは作成されていません)。あるいは、これはひどく名前のついたメソッドですか? – Fredrik

+0

は、そのテーブル構造を開始する必要があるようだので、 – Surendar

0

大規模なビジネスロジック操作では、Linqでベースするのではなく、ストアドプロシージャを作成する必要があります。次に、EFでDTOオブジェクトを作成して結果を処理し、EFでプロシージャを使用します。

この時点で、速度が向上する可能性があるために、データベース内で使用される索引に注目して、プロシージャのSQLがどのように構造化されているかが決まります。

Linq SQLは実際には定型文であり、速度を考慮して設計されていません。

私はこれを複数のEFプロジェクトで行っています。


Linqpadでlinqクエリを作成し、生成されたSQLを表示するように切り替えることもできます。これはストアドプロシージャでSQLをどのように構築するかについてのアイデアを提供します。

また、SQL CTE(Common Table Expersions)を使用して、一度に1ステップずつクエリを構築し、必要に応じてデータを作成することができます。

+0

命令のおかげで、以前はストアドプロシージャとビューで試したが、ジョイン数を超えるために期待してresult.thatsを得ることができないため、 EFで – Surendar

+0

@Surendar Linqpadでlinqクエリを作成し、生成されたSQLを表示するように切り替えます。そうすれば、私はストアドプロシージャで自分のSQLをどのように構築するのかというアイデアを得ることができます。また、SQL CTEを使用して、データが必要なだけになるまで一度に1ステップずつクエリを構築できます。 HTH – OmegaMan

+0

OmegaMan、これは意味がある、Linqpadでこれを試してみる、ありがとう。 – Surendar

関連する問題