Заставить 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, а затем применяйте остальную часть запроса в этом списке.

И можете ли выполнить запрос без его сохранения? Ну, на самом деле, вы не можете всегда пробивать результаты и, как таковые, не хранить их в переменной, но, очевидно, результаты запроса должны быть где-то сохранены.