Каково влияние AsEnumerable () на объект LINQ? - PullRequest
18 голосов
/ 15 марта 2011

Чтение вопросов здесь и здесь дало мне некоторое представление о ситуации, и кажется, что использование AsEnumerable требует много памяти.Есть ли лучший способ сделать этот LINQ и способ, которым это делается сейчас, надежны ли данные, которые выдают?операторы, кроме оператора 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
                          };

Ответы [ 3 ]

27 голосов
/ 15 марта 2011

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
              };
5 голосов
/ 15 марта 2011

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

3 голосов
/ 11 ноября 2016

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

...