Ответ 1
Вы можете запрограммировать свой исходный запрос:
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");
Я не уверен, как закодировать это с синтаксисом запроса, но id работает с лямбдой. Также работает с синтаксисом запроса для исходного запроса и лямбдой для вторичного фильтра.
Вы также можете включить метод расширения (ниже), который я закодировал некоторое время назад, чтобы включить условие, в котором содержатся утверждения. (Не работает с синтаксисом запроса):
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;
}