Объедините несколько сложных предложений WHERE в LINQ to SQL - PullRequest
4 голосов
/ 16 июля 2010

Это псевдо-SQL, который я хочу сгенерировать:

SELECT * FROM Table WHERE Column1 = @Value1 OR Column2 = @Value2

Проблема в том, что иногда не следует включать второй.Я надеялся связать вместе .Where() предложения, например, так:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.Where(t => t.Column2 == value2);

К сожалению, это не работает..Where() будет выдавать AND, если вы объедините их по умолчанию.Есть ли способ заставить его испускать OR?

Я ищу что-то вроде:

var query = context.TableName;
query = query.Where(t => t.Column1 == value1);
if (NeedsToBeIncluded(value2))
  query = query.OrWhere(t => t.Column2 == value2);

ОБНОВЛЕНИЕ Хорошо, такМой пример, приведенный выше, слишком прост.Предполагалось, что это просто пример, который очерчивает проблемное пространство.Так сказать, «в дикой природе», Column1 и Column2 могут быть «CarType» и «OwnerName», может быть, есть больше, может быть, меньше.Я просто использовал простой пример, чтобы обрисовать проблему, потому что я пытаюсь решить целый ряд проблем домена с помощью этой цепочки - .Where() s вместе.

Ответы [ 2 ]

10 голосов
/ 16 июля 2010

Одним из способов является использование PredicateBuilder .

LINQKit. Другим способом является использование списка:

var values = new List<string> { value1 };
if (NeedsToBeIncluded(value2)) values.Add(value2);
query = context.TableName.Where(t => values.Contains(t));

PB более гибок, но список решитпроблема в вашем вопросе.Обратите внимание, что вам нужно EF 4 для Contains.

3 голосов
/ 16 июля 2010

Я привел пример того, как вчера создать динамическое условие - см. здесь .Для вашего случая это было бы что-то вроде этого.

var parameter = Expression.Parameter(typeof(TableName), "t");

Expression condition = Expression.Equal(
    Expression.Property(parameter, "Column1"),
    Expression.Constant(value1)));

if (NeedsToBeIncluded(value2))
{
    condition = Expression.OrElse(
        condition,
        Expression.Equal(
            Expression.Property(parameter, "Column2"),
            Expression.Constant(value2)));
}

var expression = Expression.Lambda<Func<TableName, Boolean>>(condition, parameter);

var query = context.TableName.Where(expression);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...