Каково влияние AsEnumerable() на объект LINQ?
Чтение вопросов здесь и здесь дало мне некоторое представление о ситуации, и кажется, что использование 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
};
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
};
Использование AsEnumerable прервет запрос и сделает "внешнюю часть" в виде linq-to-objects, а не Linq-to-SQL. По сути, вы выполняете "select * from ..." для обеих ваших таблиц, а затем выполняете объединения, где фильтр предложений, упорядочение и проекция выполняются на стороне клиента.
Будьте осторожны при использовании AsEnumerable с Entity Framework. если в вашей таблице много данных, ваш запрос замедляется из-за того, что запрос сначала загружает данные и применяется условие where, упорядочение и проекция.