2017-12-17 8 views
-2

私は、Entity Frameworkを使用して、C#で、次のコードを持っている:LINQクエリ低パフォーマンス

コードで
using (var db = new RespDB()) 
       { 
        var result = (from proj in db.ProjectModels 
            where proj.Name.Equals(project.Name) 
            where proj.Platform.Equals(project.Platform) 
            where proj.Variant.Equals(project.Variant) 
            where proj.MY == project.MY 
            where proj.Controller.Equals(project.Controller) 
            select proj).FirstOrDefault(); 
       } 

、 "プロジェクト" はオブジェクトです。 問題は、データベースが大きく、このコードはVisual Studioのパフォーマンス分析を使用して非常に遅いことです。問題は「firstordefault」メソッドと「where」にあることがわかりました。 このコードを最適化する方法はありますか?

+1

クエリをSQLに書き込み、それをSSMSで実行して比較します。それは多くの 'どこですか? 'と私はあなたがインデックスでカバーされているすべての列を持っているのではないかと疑います。 – Crowcoder

+1

EFパフォーマンスはDBパフォーマンスです。 C#のパフォーマンスをチェックしないで、SQLクエリを確認してください。 – Sefe

答えて

1

エンティティモデルでは、キーまたはユニークインデックスプロパティが必要です。 (名前、プラットフォーム、バリアント)は、エンティティのキ​​ーであるかのユニークなインデックスを持っているいずれかの場合はそのため、このクエリは

var result = (from proj in db.ProjectModels 
       where proj.ID == project.ID 
       select proj).FirstOrDefault(); 

または

var result = (from proj in db.ProjectModels 
       where proj.Name == project.Name 
       && proj.Platform == project.Platform 
       && proj.Variant == project.Variant 
       select proj).FirstOrDefault(); 

のいずれかでなければなりません。

+0

私は自分のコードで見つけたいと思うので、私は最初のことをすることはできません、そのコードのideeaは、いくつかのプロジェクトのIDを見つけることです、私はそのプロジェクトエンティティが存在するかどうかを確認したい。 – Omerta

+0

"既存の"プロジェクトが何であるかを定義するキー以外のプロパティに一意索引が必要です。 –

関連する問題