Каков эффект AsEnumerable() для объекта LINQ?

Чтение вопросов здесь и здесь дало мне некоторое представление о ситуации, и похоже использование AsEnumerable является потребляемой памятью. Есть ли лучший способ сделать это LINQ и то, как это делается сейчас, являются ли данные достоверными?

Удаление результатов AsEnumerable в "Локальная последовательность не может использоваться в реализациях 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
                          };

Ответ 1

AsEnumerable() является эффектом, отличным от IEnumerable<T>, что позволяет члену-члену находить элементы Enumerable вместо Queryable. Он обычно используется, когда вы хотите заставить часть запроса запускаться как SQL (или аналогичную), а остаток для работы с использованием LINQ to Objects.

Дополнительную информацию см. в блоге Edulinq на нем.

Теперь у вас есть два вызова AsEnumerable. Я вижу, как удаление первого, но не второго может вызвать проблемы, но попытались ли вы удалить оба?

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
              };

Ответ 2

Использование AsEnumerable приведет к обрыву запроса и сделает "внешнюю часть" как linq-to-objects, а не Linq-to-SQL. Фактически, вы запускаете "select * from..." для обеих таблиц, а затем выполняете объединения, где clause filter, ordering и projection client-side.

Ответ 3

Будьте осторожны при использовании AsEnumerable с Entity Framework; если в вашей таблице много данных, ваш запрос может быть медленным, потому что запрос сначала загружает данные, а затем применяет оператор where, упорядочение и проекцию.