如何在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
相关产品推荐
相关产品推荐

