24

ここここで質問を読むと、状況についての洞察が得られ、AsEnumerable を使用するとメモリが消費されるようです。この LINQ を実行するためのより良い方法はありますか?現在実行されている方法は、信頼できるデータですか?

AsEnumerable を削除すると、「ローカル シーケンスは、Contains 演算子以外のクエリ演算子の LINQ to SQL 実装では使用できません」という結果になります。

var results = from p in pollcards.AsEnumerable()
                          join s in spoils.AsEnumerable() on new { Ocr = p.OCR, fileName = p.PrintFilename } equals new { Ocr = s.seq, fileName = s.inputFileName }
                          where p.Version == null
                          orderby s.fileOrdering, s.seq
                          select new ReportSpoilsEntity
                          {
                              seq = s.seq,
                              fileOrdering = s.fileOrdering,
                              inputFileName = s.inputFileName,
                              Ocr = p.OCR,
                              ElectorName = p.ElectorName
                          };
4

3 に答える 3

33

AsEnumerable()実質的に へのキャストでIEnumerable<T>あり、これにより、メンバー解決により のEnumerable代わりに のメンバーが検索されますQueryable。これは通常、クエリの一部を強制的に SQL (または同様のもの) として実行し、残りを LINQ to Objects を使用して実行する場合に使用されます。

詳細については、Edulinq のブログ記事を参照してください。

これで、実際にへの 2 つの呼び出しができましたAsEnumerable。2 番目ではなく 1 番目を削除すると問題が発生する可能性があることはわかりますが、両方を削除しようとしましたか?

var results = from p in pollcards
              join s in spoils
                 on new { Ocr = p.OCR, fileName = p.PrintFilename } 
                 equals new { Ocr = s.seq, fileName = s.inputFileName }
              where p.Version == null
              orderby s.fileOrdering, s.seq
              select new ReportSpoilsEntity
              {
                  seq = s.seq,
                  fileOrdering = s.fileOrdering,
                  inputFileName = s.inputFileName,
                  Ocr = p.OCR,
                  ElectorName = p.ElectorName
              };
于 2011-03-15T11:32:16.033 に答える
6

AsEnumerable を使用すると、クエリが中断され、Linq-to-SQL ではなく linq-to-objects として「外側の部分」が実行されます。事実上、両方のテーブルに対して「select * from ...」を実行してから、結合、where 句のフィルター、順序付け、および射影のクライアント側を実行しています。

于 2011-03-15T11:31:09.340 に答える