Если вы ищете опционально добавление AND xyz
, вы можете просто связать Where
звонки:
var projects = dataContext.Projects.Where(p => p.ProjectDescription.Contains(search));
if (isID)
projects = projects.Where(p => p.ProjectID == projectID);
К сожалению, все не так просто, когда вы хотите сделать OR xyz
. Чтобы это работало, вам нужно будет вручную создать выражение предиката. Это не красиво. Один из способов сделать это -
Expression<Func<Project, bool>> predicate = p => p.ProjectDescription.Contains(search);
if (isID)
{
ParameterExpression param = expr.Body.Parameters[0];
predicate = Expression.Lambda<Func<Project, bool>>(
Expression.Or(
expr.Body,
Expression.Equal(
Expression.Property(param, "ProjectID"),
Expression.Constant(projectID))),
param);
}
var projects = dataContext.Projects.Where(predicate);
Обратите внимание, что добавление условия в существующий предикат - это намного больше, чем создание исходного выражения, потому что нам нужно полностью перестроить выражение. (Предикат должен всегда использовать один параметр; объявление двух выражений с использованием лямбда-синтаксиса создаст два отдельных объекта выражения параметра, по одному для каждого предиката.) Обратите внимание, что компилятор C # делает примерно то же самое за кадром, когда вы используете лямбда-синтаксис для исходного предикат.
Обратите внимание, что это может показаться знакомым, если вы привыкли к API-интерфейсу критериев для Hibernate, просто немного подробнее.
Обратите внимание, однако, что некоторые реализации LINQ довольно умны, поэтому может также работать следующее:
var projects = dataContext.Projects.Where(
p => p.ProjectDescription.Contains(search)
|| (isID && p.ProjectID == projectID));
YMMV, однако, проверьте сгенерированный SQL.