2012-04-18 17 views
0

私は2つの異なるリポジトリからのデータ取得:LINQクエリの最適化

 List<F> allFs = fRepository.GetFs().ToList(); 
     List<E> allEs = eRepository.GetEs().ToList(); 

は今、私はそれらを結合する必要があるので、私は次のようにします。

 var EFs = from c in allFs.AsQueryable() 
         join e in allEs on c.SerialNumber equals e.FSerialNumber 
         where e.Year == Convert.ToInt32(billingYear) && 
         e.Month == Convert.ToInt32(billingMonth) 
         select new EReport 
         { 
          FSerialNumber = c.SerialNumber, 
          FName = c.Name, 
          IntCustID = Convert.ToInt32(e.IntCustID), 
          TotalECases = 0, 
          TotalPrice = "$0" 
         }; 

私はこのLINQクエリを改善することができますどのようにそれそうより速く走りますか?私は何か提案を感謝します。

おかげ

+0

'fRepository'と' eRepository'何ですか?彼らは何を返しますか? –

+6

なぜあなたは "ToList()"をやっていますか?それはすぐにクエリを実行し、allFsとallEsを戻すことになります。 – Robaticus

+0

これは申し訳ありませんが、IQueriable とIQueriable s – Sev

答えて

5

あなたがはるかに望ましい解決策になるデータの両方の部分を含み、1つのリポジトリを作成することができるしている場合を除き、私はプロセスをスピードアップする可能性がある次のものを見ることができます。

  1. you'rは常に月と年によってすべてのEさんをフィルタリングするので、あなたは、その方法は、あなたがEの数を減らすのIQueryableにToListメソッドを呼び出す前に、あなたので(おそらくかなり)
  2. に参加することを行う必要があります匿名タイプを使用して転送するデータの量を制限することができます
  3. Fから取得するシリアル番号の数に応じて、シリアル番号でEをフィルタリングできますデータベース(またはその逆)。しかし、ほとんどのシリアルナンバーが両方のセットで期待されるなら、それはそれほど助けにはなりません。

おそらく、データが来ているためにリポジトリを1つにまとめることができない理由があります2つの別々のデータベース。

コードは、上記の点1及び2で更新これと同様であろう。

var allFs = fRepository.GetFs().Select(f => new {f.Name, f.SerialNumber}).ToList(); 

int year = Convert.ToInt32(billingYear); 
int month = Convert.ToInt32(billingMonth); 

var allEs = eRepository.GetEs().Where(e.Year == year && e.Month == month).Select(e => new {e.FSerialNumber, e.IntCustID}).ToList(); 


var EFs = from c in allFs 
    join e in allEs on c.SerialNumber equals e.FSerialNumber 
    select new EReport 
    { 
     FSerialNumber = c.SerialNumber, 
     FName = c.Name, 
     IntCustID = Convert.ToInt32(e.IntCustID), 
     TotalECases = 0, 
     TotalPrice = "$0" 
    }; 
+0

十分にありがとうございます。おかげで – Sev

+0

ちょうど好奇心が...どのくらい速いそれだった:) – jessehouwing