Вы хотите функцию окна:
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;
Проблема в том, что ваш метод должен выполняться локально, а не в базе данных? Если это так, 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
и фильтруя , чтобы результат был более эффективным, чем сначала загружать все.
Вы получаете это сообщение, когда пишете запрос, который LinqToSql не знает, как перевести на SQL (что он тоже говорит).
Я не уверен, что получаю точно что вы спрашиваете, но, насколько я вижу, у вас есть следующие опции:
Предполагая, что мы исключаем # 3, давайте посмотрим на другие 2 примера.
Переписываем это - чтобы помочь с этим, нам нужен ваш linq запрос.
Здесь вы берете часть, которая не может быть переведена из исходного запроса, затем по вашему вызову Iqueryable ToList, а затем применяете оставшуюся часть запроса к этому списку.
И можете ли вы выполнить запрос без необходимости хранить его? Ну не совсем,
List<Employees> myEmployees = myqueryable.ToList();
, а затем вы можете делать свои вещи linq в этом списке.