Как пополнить битку Linq в Sql where?

Мне передают набор параметров querystring в классе Parameters, с помощью которых можно запрашивать базу данных изображений. При каждом вызове некоторые параметры могут быть нулевыми. Поэтому в sql я бы построил запрос, например

if (parameters.Value1 != null)
{
    sql.Append("sql_where_clause");
}

if (parameters.Value2 != null)
{
    sql.Append("sql_where_clause");
}

Как мне сделать то же самое с Linq?

Ответ 1

easy, IQueryables не оцениваются до тех пор, пока вы не перечислите, так что просто продолжайте отмечать те предложения where.

if (parameters.Value1 != null)
{
    results = results.Where(x => <some condition>);
}

if (parameters.Value2 != null)
{
    results = results.Where(x => <some other condition>);
}

Ответ 2

Лучший способ динамически строить where-clauses - использовать замечательный Albahari PredicateBuilder.

Вы можете использовать это для создания выражений where-where, содержащих OR, а также AND. Языковая интеграция для этого изначально была предназначена, но не совсем сделал его в С# 3.

Например:

var whereClause = PredicateBuilder.False<Customer>();

if (parameters.Value1 != null)
{
    whereClause = whereClause.Or(customer => customer.City == parameters.Value1);
}

var query = db.Customers.Where(whereClause);