You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中构建含OR条件的Payment状态查询?

解决方案建议

你的问题确实是因为多次调用.Where()会生成AND逻辑的查询,而单条Payment不可能同时属于多个状态,所以返回0条数据。下面是几种可行的修复方案:

方案一:直接使用Contains(推荐)

EF Core/Linq to SQL会自动把集合的Contains方法转换成SQL的IN语句,等价于OR逻辑,代码简洁高效:

public IQueryable<Payment> GetPaymentQuery(List<PaymentStatus> statuses)
{
    IQueryable<Payment> query = _dbContext.Payment.AsQueryable();
    
    if (statuses != null && statuses.Any())
    {                
        query = query.Where(x => statuses.Contains(x.Status));
    }

    return query;
}

public enum PaymentStatus{
    New, IsProcessing, Done, Cancelled
}

这个写法会生成类似WHERE Status IN (0,1,2)的SQL语句(对应枚举的数值),完美匹配你需要的OR查询逻辑。

方案二:动态构建OR表达式(复杂场景适用)

如果未来需要更复杂的OR条件组合(比如除了状态还要加其他字段的OR判断),可以用表达式树动态拼接OR逻辑:

using System.Linq.Expressions;

public IQueryable<Payment> GetPaymentQuery(List<PaymentStatus> statuses)
{
    IQueryable<Payment> query = _dbContext.Payment.AsQueryable();
    
    if (statuses != null && statuses.Any())
    {
        // 初始化一个始终为false的表达式,作为OR的起始
        Expression<Func<Payment, bool>> orExpression = x => false;
        
        foreach (var status in statuses)
        {
            var currentStatus = status; // 捕获循环变量,避免闭包陷阱
            orExpression = Expression.Lambda<Func<Payment, bool>>(
                Expression.OrElse(
                    orExpression.Body,
                    Expression.Equal(
                        Expression.PropertyOrField(orExpression.Parameters[0], "Status"),
                        Expression.Constant(currentStatus)
                    )
                ),
                orExpression.Parameters[0]
            );
        }
        
        query = query.Where(orExpression);
    }

    return query;
}

这个方法更灵活,但对于当前的简单场景,方案一已经足够。

内容的提问来源于stack exchange,提问作者anhtv13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:20:27