Вынудить IQueryable выполниться?

Вы хотите функцию окна:

select t.*,
       sum(cases - closed) over (order by year) as state
from table t;

РЕДАКТИРОВАТЬ: Для более старой версии вы можете использовать apply:

select t.*, t1.state
from table t cross apply 
     (select sum(t1.cases - t1.closed) as state
      from table t1
      where t1.yr <= t.yr
     ) t1;
15
задан Kirschstein 27 April 2009 в 09:28
поделиться

3 ответа

Проблема в том, что ваш метод должен выполняться локально, а не в базе данных? Если это так, AsEnumerable ваш друг. Это очень простой метод, что-то вроде:

public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
    return source;
}

Важно то, что он делает тип времени компиляции результата IEnumerable , а не IQueryable , это означает, что любые операторы запросов LINQ, которые вы вызываете после этого, будут LINQ to Objects вместо 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 и фильтруя , чтобы результат был более эффективным, чем сначала загружать все.

28
ответ дан 1 December 2019 в 01:17
поделиться

Вы получаете это сообщение, когда пишете запрос, который LinqToSql не знает, как перевести на SQL (что он тоже говорит).

Я не уверен, что получаю точно что вы спрашиваете, но, насколько я вижу, у вас есть следующие опции:

  1. Перепишите ваш запрос так, чтобы LinqToSql МОЖЕТ перевести его
  2. Выполните столько запросов, сколько можете на сервере Sql, затем выполните остальное в памяти (используя linq к объектам)
  3. Садитесь и плачьте

Предполагая, что мы исключаем # 3, давайте посмотрим на другие 2 примера.

  1. Переписываем это - чтобы помочь с этим, нам нужен ваш linq запрос.

  2. Здесь вы берете часть, которая не может быть переведена из исходного запроса, затем по вашему вызову Iqueryable ToList, а затем применяете оставшуюся часть запроса к этому списку.

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

2
ответ дан 1 December 2019 в 01:17
поделиться
List<Employees> myEmployees =  myqueryable.ToList();

, а затем вы можете делать свои вещи linq в этом списке.

7
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: