Если вы используете синтаксис LINQ для построения языка, вы неявно объявляете выражение lamba - и , что выражение lamba - Expression<Func <>>
- поэтому вам не нужно выражение where для вернуть Выражение, вам нужно, чтобы было выражением.
1010 *, например *
var q = from row in myTable
where row.a < aMax
select row.b;
// which translates to
var q = myTable.Where(row => row.a < aMax).Select(row => row.b);
Теперь вам нужно «кешировать» row => row.a < aMax
, а не просто значение из row.a < aMax
, если хотите. Итак, если бы вы написали что-то вроде этого ...
Expression<Func<?,bool>> cachedExpression = row => row.a < aMax;
var q = from row in myTable
where cachedExpression
select row.b;
Ну, вы говорите: "где, для строки, верно, что (для строки верно, что row.a меньше, чем aMax)". Это нонсенс, и он не будет компилироваться, если cachedExpression имеет тип Expression<Func<?,bool>>
, а myTable - это таблица, предоставленная LinqToSql. Это будет означать что-то вроде этого:
Expression<Func<?,bool>> cachedExpression = row => row.a < aMax;
//nonsense .Where:
var q = myTable.Where(row => cachedExpression).Select(row => row.b);
//effectively says this:
var q = myTable.Where(row => (row0 => row0.a < aMax)).Select(row => row.b);
Теперь, это допустимо в том смысле, что возможно для поставщика запросов linq реализовать выражение where с ненулевым значением, но это очень странная вещь делать; конечно, ни один из стандартных провайдеров linq (таких как Linq to Sql) не делает этого.
Так что должен делать? Что-то вроде:
//not .Where(row=>cachedExpression)!
var q = myTable.Where(cachedExpression).Select(row => row.b);
//or, alternatively:
var q = from filteredRow in myTable.Where(cachedExpression)
select filteredRow.b;