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
Можно кодировать исходный запрос:
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;
}
Просто должен использовать условную проверку существование параметра. Например:
where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber)
Тот путь, если номер продуктов не вводится, что выражение возвратит true во всех случаях, но если это вводится, это только возвратит true при соответствии.
У Вас есть способность к ИЛИ с ||.
Выезд этот поток, поскольку это могло бы дать Вам некоторые хорошие подсказки: C# LINQ, эквивалентный из несколько сложного SQL-запроса