我试图从数据库中获取记录,其中任何参数都可以为空或为空,这就是我所拥有的,但没有给我正确的结果。五个参数中任何一个都可以为 null,但其中一个必须具有值。
public async Task<IEnumerable<SomeTable>> GetByCondition(string param1, string param2, string param3, string param4, int param5)
{
var data = await _dataContext.SomeTable.Where(a => a.param1 == (string.IsNullOrEmpty(param1) ? "" : param1)
&& a.param2 == (string.IsNullOrEmpty(param2) ? "" : param2)
&& a.param3 == (string.IsNullOrEmpty(param3) ? "" : param3)
&& a.param4 == (string.IsNullOrEmpty(param4) ? "" : param4)
&& a.param5 == (param5 == 0 ? 0 : param5)).ToListAsync();
return data;
}
扩展注释中提供的链接,您使用的方法将导致参数的条件性需要转换为 SQL。它可以工作,但写起来相当庞大。您的方案可能不起作用,因为记录参数可能为 #null,但您生成的查询会将没有参数要求的行与空字符串进行比较。您可能需要的看起来更像是:
...这可能仍然没有所需的行为,具体取决于您真正想要如何处理 #null 参数和/或 #null 列值。
然而,如前所述,这将导致任何空检查条件被写入 SQL 并为每个查询中的每个参数进行计算。处理 AND 组合在一起的简单场景时,更好的解决方案是将条件移至代码中,并且仅在存在条件时附加过滤条件:
这会导致 SQL 查询仅包含具有要过滤值的参数的条件。使用
AsQueryable()
initial 仅需将结果查询变量转换为IQueryable<SomeTable>
而不是DbSet<SomeTable>
。或者,您可以使用显式转换来启动它:...或者如果您有非条件
Where
子句,则AsQueryable()
不需要,即:对于更复杂的场景,您可能需要 OR 条件之类的东西,那么我建议使用动态谓词构建器解决方案,该解决方案可以使用
Where
所需的逻辑有条件地构建子句表达式。不需要将条件进行 AND 组合在一起,因为这是 EF 遇到多个Where
子句时的默认行为。