2016-05-11 5 views
2
私は以下のクラスを持っている

とのIEnumerableを変換する際longに取っ:ToListメソッド()複数のオブジェクト

public class CountryVM 
    { 
     #region Properties 
     public int CountryID { get; set; } 
     public string Code { get; set; } 
     public string Name { get; set; } 
     #endregion 

     #region Constructors 
     /// <summary> 
     /// Constructor 
     /// </summary> 
     public CountryVM() 
     { 

     } 

     /// <summary> 
     /// Constructor that creates a View Model based of an Entity object 
     /// </summary> 
     /// <param name="countryCode">Fills data to View Model</param> 
     public CountryVM(Country_Code countryCode) 
     { 
      if (countryCode != null) 
      { 
       CountryID = countryCode.Country_Code_ID; 
       Code = countryCode.Country_Code1; 
       Name = countryCode.Country_Name; 
      } 
     } 
     #endregion 
    } 


public class StateVM 
    { 
     #region Properties 
     public int StateID { get; set; } 
     public int CountryID { get; set; } 
     public string Code { get; set; } 
     public string Name { get; set; } 

     public CountryVM Country { get; set; } 
     #endregion 

     #region Constructors 
     /// <summary> 
     /// Constructor 
     /// </summary> 
     public StateVM() 
     { 

     } 

     /// <summary> 
     /// Constructor that creates a View Model based of an Entity object 
     /// </summary> 
     /// <param name="stateCode">Fills data to View Model</param> 
     public StateVM(State_Code stateCode) 
     { 
      if (stateCode != null) 
      { 
       StateID = stateCode.State_Code_ID; 
       CountryID = stateCode.Country_Code_ID; 
       Code = stateCode.State_Code1; 
       Name = stateCode.State_Name; 

       Country = new CountryVM(stateCode.Country_Code); 
      } 
     } 
     #endregion 
    } 

COUNTRY_CODEとSTATE_CODEの両方があり、私のテーブルからテーブルには、エンティティオブジェクトに変換します。

私は、次のコード行を実行します。

viewModelList = viewModelList.ToList(); 

を実行している場合

IEnumerable<State_Code> entityList = _stateRepository.GetAllStateCodes(); 
    IEnumerable<StateVM> viewModelList = entityList.Select(s => new StateVM(s)); 
    viewModelList = viewModelList.ToList(); 

それは、1〜3秒かかります。私はそれを試していましたが、私はStateVMオブジェクトから、

Country = new CountryVM(stateCode.Country_Code); 

を削除しました。これは完璧に動作します。

StateVMがインスタンス化されると、CountryVMが内部でインスタンス化されるため、時間がかかりすぎる理由があると思います。

パフォーマンスを向上させる方法はありますか?

答えて

2

ToList()は常にコレクションを列挙します。実行しているのは、生成されたSQL文を実行している他のテーブルにリンクして、接続されたデータプロパティを取得する遅延ロードされたすべてのプロパティです。必要がない場合は、最少量のデータを確実に取得するまでコレクションをフィルタリングする必要があります。必要があることが分かっている場合は、代わりにプロパティを基にしてオブジェクトに対処するオブジェクトではなく、元の要求のすべてを読み込むために熱心な読み込みを使用することができます。ご覧くださいObjectQuery.Include

0

Visual Studio 2013 Premium(またはそれ以上のバージョン)を使用している場合は、コードの実行中に診断ツールのデバッガウィンドウに注目してください。トレースは、エンティティを取得するときに何が起きているかを知るのに役立ちます。

よくある間違いは、エンティティがナビゲートする他のエンティティとの関係を持つ場合、Entity Frameworkのデフォルトの遅延読み込み動作に依存することです。あなたのケースでは、クエリを実行するときにN + 1個のSELECT文が実行される可能性があります.1つはすべての州コードを取得し、もう1つは各国コードです(State_CodeCountry_Codeはそれぞれ独自のエンティティです)。

追加のヒントについては、Entity Framework Loadingを参照してください。これがパフォーマンスの問題の一般的な原因であるため、「Entity Framework N + 1」を検索することもできます。

0

パフォーマンスを向上させる方法はありますか?

パフォーマンスを向上させる最善の方法は、ジョインを含め、実際に必要な列だけのビューを作成することです。これにより、データベースの効率的な使用が可能になり、さらに優れたパフォーマンスを得るためにカバリングインデックスを使用するオプションが提供されます。

2番目に良いオプションは、Jonathon Chaseの答えで説明されているように、インクルードを使用することです。