Какое влияние оказывает AsEnumerable () на объект LINQ?

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

Удаление AsEnumerable приводит к появлению «Локальная последовательность не может использоваться в реализациях LINQ to SQL операторов запроса, кроме оператора Contains».

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

person Andy    schedule 15.03.2011    source источник


Ответы (3)


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
              };
person Jon Skeet    schedule 15.03.2011
comment
указанная мной ошибка возникла при удалении обоих AsEnumerables. (я не пробовал удалять только один). Имеет ли значение, что порталы и карточки сами по себе являются операторами LINQ? (IQueryable ‹PollcardENtity› и Коллекция ‹SpoilsEntity›) - person Andy; 15.03.2011
comment
@Andy: Да, тот факт, что spoils - это коллекция в памяти, определенно важен. Я предположил, что это еще один запрос к БД. Я не знаю способа присоединить половину к половине базы данных. spoils изначально взято из базы данных? - person Jon Skeet; 15.03.2011
comment
трофеи создаются с помощью двух запросов, один для топ-10, один для последних 10, выполнения объединения по результату и последующего заполнения Коллекции для каждого из них через это объединение. Я не уверен, почему мы не возвращаем объединение и не конвертируем его из Iqueryable в коллекцию. (может ли возвращение IQuerryable решить потребность в AsEnumerables?) - person Andy; 15.03.2011
comment
@Andy: Оставив объединение как IQueryable<T> может действительно исправить ... попробуйте :) Конечно, сгенерированный SQL может быть довольно уродливым, но он может делать то, что вы хотите. - person Jon Skeet; 15.03.2011

Использование AsEnumerable прервет запрос и выполнит «внешнюю часть» как linq-to-objects, а не Linq-to-SQL. Фактически, вы запускаете "select * from ..." для обеих таблиц, а затем выполняете соединения, где фильтрация предложений, упорядочивание и проекция на стороне клиента.

person KristoferA    schedule 15.03.2011

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

person Damith Asanka    schedule 11.11.2016