Заставить IQueryable выполнить?
У меня есть метод, который "не имеет перевода в SQL", который я хочу выполнить на IQueryable, есть ли способ заставить IQueryable выполнять, не сохраняя его в каком-то промежуточном классе?
Ответы
Ответ 1
Проблема, которую вы хотите, чтобы ваш метод выполнялся локально, а не в базе данных? Если да, AsEnumerable
- ваш друг. Это очень простой метод, например:
public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
return source;
}
Важно то, что он делает тип времени компиляции результата IEnumerable<T>
, а не IQueryable<T>
, что означает, что любые операторы запроса LINQ, которые вы вызываете после этого, будут LINQ для объектов, а не LINQ to SQL.
Например:
var query = context.Employees
// Filtering performed in SQL
.Where(emp => emp.IsFullTime)
.AsEnumerable()
// Projection performed locally; ComputeSalary has no
// SQL equivalent
.Select(emp => new { Employee = emp,
Salary = ComputeSalary(emp) });
Вы можете вызвать ToList
, как это было предложено в другом месте, но если вы выполняете фильтрацию и не нуждаетесь в полном списке в памяти, вызов AsEnumerable
и фильтрация этого результата будет более эффективной, чем загрузка сначала.
Ответ 2
List<Employees> myEmployees = myqueryable.ToList();
а затем вы можете сделать свой материал linq в этом списке.
Ответ 3
Вы получаете это сообщение, когда вы написали запрос, который LinqToSql не знает, как перевести на SQL (это то, что он говорит тоже).
Я не уверен, что получаю именно то, что вы просите, но, насколько я вижу, у вас есть следующие возможности:
- Перепишите свой запрос, чтобы LinqToSql CAN перевел его
- Сделайте как можно больше запросов на сервере Sql, а затем сделайте остаток в памяти (используя linq для объектов)
- Присядьте и плачь.
Предполагая, что мы исключаем № 3, рассмотрим другие 2 примера.
-
Переписывая его - чтобы помочь с этим, нам нужен ваш запрос linq.
-
Здесь вы извлекаете часть, которая не может быть переведена из исходного запроса, а затем в ваш Iqueryable call ToList, а затем применяйте остальную часть запроса в этом списке.
И можете ли выполнить запрос без его сохранения? Ну, на самом деле, вы не можете всегда пробивать результаты и, как таковые, не хранить их в переменной, но, очевидно, результаты запроса должны быть где-то сохранены.