Linq链接where子句作为Or或And

时间:2019-06-17 19:22:39

标签: c# linq

此代码中链接了多个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));

1 个答案:

答案 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));
}