2017-05-12 7 views
-3

私は直接それがほぼ瞬時に完了したエンティティのコンテキストを使用して、これを実行した場合、私は、次のLINQクエリエンティティLINQのパフォーマンス

(from L in linksRepo.PSM_Links() 
       join U in usersRepo.PSM_Users() on L.UserId equals U.Id 
     where L.StationId == stationId && L.JobTypeId == 3 
     select new VW_PollClerks 
     { 
      Id = U.Id, 
      Forename = U.Forename, 
      Surname = U.Surname, 
      StaffEmail = U.StaffEmail, 
      TelephoneHome = U.TelephoneHome, 
      TelephoneWork = U.TelephoneWork, 
      TelephoneMobile = U.TelephoneMobile 
     }).ToList(); 

を持っています。しかし、上記のように各テーブルのリポジトリを使用すると、完了には30秒以上かかります。私はそれを壊して、それはスピードの問題を引き起こすPSM_Usersテーブルであるように見えますが、これはなぜですか?リポジトリは次のようになります

以下は私と同じに見えますが、ほとんど瞬時に完了します。

 using (Models.PSMContext db = new PSMContext()) 
     { 
       List<PSM_Users> user = (from L in db.PSM_Links() 
       join U in db.GetUser() on L.UserId equals U.Id 
     where L.StationId == stationId && L.JobTypeId == 3 
     select new VW_PollClerks 
     { 
      Id = U.Id, 
      Forename = U.Forename, 
      Surname = U.Surname, 
      StaffEmail = U.StaffEmail, 
      TelephoneHome = U.TelephoneHome, 
      TelephoneWork = U.TelephoneWork, 
      TelephoneMobile = U.TelephoneMobile 
     }).ToList(); 
     } 
+0

LINQ to Entitiesではなく、リポジトリの設計、特にメモリ内のテーブル全体のロードとLINQ to Objectsクエリの実行を引き起こすIEnumerable を返します。 –

+0

'db.GetUser()'には引数が必要です。 –

答えて

2

.ToList();コールを失います。これは、クエリのビルドを分解します。それはクライアントにデータを収集し、クライテリアはクライアント側で実行されます。あなたはむしろそれが行serversideを選択したいと思う。 IEnumerable<>を返す代わりに、戻り値の型としてIQueryable<>を使用します。 (またはの種類)

public IQueryable<PSM_Users> PSM_Users() 
{ 
    return db.PSM_Users; 
} 

それが必要とされていない場合ToList()は絶対に使用しないでください。

関連する問題