此代码中链接了多个where子句。我需要更改以下代码片段中最后一个where子句的逻辑,使其表现为“或”而不是“与”。 这背后的逻辑是,我希望所有交易都在传入的日期范围和状态为TransactionStatus.Outstanding的所有交易之间。目前,逻辑运算是与运算,因此只会让我两者相交。
我在Stack Overflow上看到过许多其他帖子,这些帖子都针对我正在处理的场景,但是似乎没有任何帮助。
任何有关代码语法的指导将不胜感激!
IQueryable<Transaction> transactions =
_db.Transactions
.Include(t => t.DepositSource)
.Include(t => t.WithdrawalSource)
.Include(t => t.ReconciliationReport)
.Where(t => t.FundId == fundId);
if (criteria.UseClearedDate)
{
transactions = transactions
.Where(t => t.ReconciliationReport != null
&& (t.ReconciliationReport.DateCreated.Date >= criteria.StartDate.Date
&& t.ReconciliationReport.DateCreated.Date <= criteria.EndDate.Date));
}
else
{
transactions = transactions
.Where(t => t.Date.Date >= criteria.StartDate.Date
&& t.Date.Date <= criteria.EndDate.Date);
}
transactions = transactions
.Where(t => (criteria.Statuses.Contains(t.ReconciliationId == null
? t.IsVoided
? TransactionStatus.Void
: TransactionStatus.Outstanding
: TransactionStatus.Cleared))
&& criteria.Sources.Contains(t.TransactionSource)
&& criteria.Types.Contains(t.TransactionType));
答案 0 :(得分:-1)
在子句和使它们充当or
的情况下,没有一种“链式”方法。第一个Where
子句会过滤掉所有与谓词不匹配的内容,因此第二个过滤器无法知道不存在与第一个过滤器不匹配的子句。
您可以按照重复问题中的建议使用第三方PredicateBuilder
,也可以使用为您执行此操作的自定义扩展方法:
(未经测试)之类的东西
public IQueryable<T> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource,Boolean>> pred1, Expression<Func<TSource,Boolean>> pred2)
{
return source.Where(t => pred1(t) || pred2(t));
}