LINQ к оператору Where SQL дополнительные критерии

dis является вашим другом, если исходный код недоступен:

>>> import dis
>>> def foo(arg1,arg2):
...     #do something with args
...     a = arg1 + arg2
...     return a
...
>>> dis.dis(foo)
  3           0 LOAD_FAST                0 (arg1)
              3 LOAD_FAST                1 (arg2)
              6 BINARY_ADD
              7 STORE_FAST               2 (a)

  4          10 LOAD_FAST                2 (a)
             13 RETURN_VALUE
70
задан RSolberg 30 September 2009 в 04:42
поделиться

3 ответа

Можно кодировать исходный запрос:

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;

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

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

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

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

        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;
}
121
ответ дан andleer 24 November 2019 в 13:22
поделиться

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

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

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

31
ответ дан CodeRedick 24 November 2019 в 13:22
поделиться

У Вас есть способность к ИЛИ с ||.

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

0
ответ дан Community 24 November 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: