Синтаксис для выражения запроса, включающего предложение where
, (упрощение полной грамматики)
from identifier in expression where boolean-expression select expression
whereClause
не является логическим выражением. Чтобы исправить это, вы должны сказать
from c in _ctx.Companies where whereClause.Compile()(c) select c;
Обратите внимание, что если бы whereClause
было Func<Company, bool>
, вы могли бы обойтись без
from c in _ctx.Companies where whereClause(c) select c;
Обратите внимание, что
from x in e where f
механически переводится компилятором в
(from x in e).Where(x => f)
Я говорю механически, потому что он выполняет этот перевод без какого-либо семантического анализа для проверки правильности вызовов методов и т. Д. Этот этап наступает позже, после того как все выражения запроса были преобразованы в выражения вызова метода LINQ.
В частности,
from c in _ctx.Companies where whereClause select c
переводится как
_ctx.Companies.Where(c => whereClause).Select(c)
что явно бессмысленно.
Причина, по которой
from c in _ctx.Companies.Where(whereClause) select c
допустимо, потому что IEnumerable<Company>.Where
имеет перегрузку, принимающую Func<Company, bool>
, и существует неявное преобразование из Expression<Func<Company, bool>>
в Func<Company, bool>
.