我正在使用以下函数从 mongoDB 获取数据:
Task<IEnumerable<T>> ReadDocuments(Expression<Func<T,bool>> predicate)
我需要根据多种条件过滤数据,并且我正在使用如下函数:
cars = await this.carRepository.ReadDocuments(car => car.no == no &&
car.engine == engine && car.model == model && car.color == color && car.country==country)
对于上面的代码,我面临 SonarQube 问题:
减少表达式中使用的条件运算符数量 (4)(最多允许 3) 表达式不应太复杂
该问题的文档链接,这对我的案例不是很有用
如何拆分 Expression<Func<T,bool> 谓词中的条件以减少语句中条件运算符的数量?
我建议您在应用于 LINQ 查询表达式时忽略此“可维护性”警告。 根据文档,SonarQube 建议通过将部分提取到方法中来简化复杂的条件,例如:
会成为:
但是,您不能对传递给 LINQ 数据库提供程序的查询表达式采用此解决方案,因为数据库提供程序通常无法将任意
Expression.Invoke
或Expression.Call
.NET 方法调用转换为数据库查询。参见例如作为解决方法,由于您确实需要使用所有五个条件运行查询,所以我想您可以创建一些使用
AndAlso
表达式组合多个谓词表达式的扩展方法:然后向您的类型添加一些方法(或扩展方法),
carRepository
例如:现在您将能够执行以下操作:
但老实说,我不认为这会使代码更具可读性或可维护性(甚至使我们期望表达式的短路行为变得
&&
不那么明显)。样机小提琴在这里。