LINQ to SQL Where Clause Необязательные критерии - PullRequest
70 голосов
/ 11 марта 2009

Я работаю с запросом LINQ to SQL и столкнулся с проблемой, когда у меня есть 4 необязательных поля для фильтрации результатов данных. Необязательно, я имею в виду, есть выбор, вводить значение или нет. В частности, несколько текстовых полей, которые могут иметь значение или иметь пустую строку, и несколько раскрывающихся списков, в которых могло бы быть выбрано значение или, возможно, нет ...

Например:

    using (TagsModelDataContext db = new TagsModelDataContext())
     {
        var query = from tags in db.TagsHeaders
                    where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                    select tags;
        this.Results = query.ToADOTable(rec => new object[] { query });
    }

Теперь мне нужно добавить следующие поля / фильтры, но только если они предоставлены пользователем.

  1. Номер продукта - приходит из другой таблицы, которую можно присоединить к TagHeaders.
  2. Номер PO - поле в таблице TagsHeaders.
  3. Номер заказа - аналогично номеру заказа на поставку, просто другой столбец.
  4. Статус продукта - если пользователь выбрал это из выпадающего списка, необходимо применить выбранное значение здесь.

Мой запрос уже работает отлично, но для завершения функции нужно иметь возможность добавить эти 4 других элемента в предложение where, просто не знаю, как!

Ответы [ 3 ]

120 голосов
/ 11 марта 2009

Вы можете закодировать свой оригинальный запрос:

var query = from tags in db.TagsHeaders
                where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                select tags;

А затем на основе условия добавьте дополнительные ограничения where.

if(condition)
    query = query.Where(i => i.PONumber == "ABC"); 

Я не уверен, как кодировать это с помощью синтаксиса запроса, но id работает с лямбда-выражением. Также работает с синтаксисом запроса для начального запроса и лямбда-выражением для вторичного фильтра.

Вы также можете включить метод расширения (ниже), который я кодировал некоторое время назад, чтобы включить условные операторы where. (Не работает с синтаксисом запроса):

        var query = db.TagsHeaders
            .Where(tags => tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()))
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE)
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE)
            .WhereIf(condition1, tags => tags.PONumber == "ABC")
            .WhereIf(condition2, tags => tags.XYZ > 123);

Метод расширения:

public static IQueryable<TSource> WhereIf<TSource>(
    this IQueryable<TSource> source, bool condition,
    Expression<Func<TSource, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

Вот тот же метод расширения для IEnumerables:

public static IEnumerable<TSource> WhereIf<TSource>(
    this IEnumerable<TSource> source, bool condition,
    Func<TSource, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}
31 голосов
/ 11 марта 2009

Просто нужно использовать условную проверку существования параметра. Например:

where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber)

Таким образом, если номер продукта не введен, это выражение будет возвращать true во всех случаях, но если оно введено, оно будет возвращать true только при сопоставлении.

0 голосов
/ 11 марта 2009

У вас есть возможность ИЛИ с ||.

Проверьте эту ветку, так как она может дать вам несколько хороших указателей: C # LINQ эквивалент несколько сложного SQL-запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...