Каков эффект 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
, упорядочение и проекцию.