【发布时间】:2019-10-31 10:07:23
【问题描述】:
此代码中有多个链接的 where 子句。我需要将下面代码 sn-p 中最后一个 where 子句的逻辑更改为“OR”而不是“AND”。 这背后的逻辑是,我希望所有交易都在传入的日期范围之间,以及所有交易状态为 TransactionStatus.Outstanding 的交易。目前逻辑是在做一个 AND 所以它只给了我两者之间的交集。
我在 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));
【问题讨论】:
-
LinqKit 库很好地抽象了这一点。看看吧。
-
@JSteward 你能告诉我如何在我的代码 sn-p 中实现 PredicateBuilder 吗?非常感谢!
-
如果您在应用 PredicateBuilder 时遇到困难,您可以通过一个简单的 UNION 来解决您的
if/else的结果,并使用一个新查询将您的最终Where子句应用于原始交易集。