0

2 つの異なるリポジトリからデータを取得します。

        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 クエリをより高速に実行するにはどうすればよいですか? 提案をいただければ幸いです。

ありがとう

4

1 に答える 1

5

両方のデータを含む 1 つのリポジトリを作成できない限り (これははるかに望ましい解決策です)、プロセスを高速化する可能性のある次のことがわかります。

  1. 常にすべての E を月と年でフィルタリングしているため、IQueryable で ToList を呼び出す前にそれを行う必要があります。そうすれば、結合内の E の数を (おそらくかなり) 減らすことができます。
  2. E と F のフィールドのサブセットのみを使用しているため、匿名型を使用して転送するデータの量を制限できます
  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"
    };
于 2012-04-18T21:09:28.017 に答える