在 C# linq 中结合多个具有可选参数的 where 条件?

Posted

技术标签:

【中文标题】在 C# linq 中结合多个具有可选参数的 where 条件?【英文标题】:Combine multiple where conditions having optional parameters in C# linq? 【发布时间】:2020-06-28 20:04:48 【问题描述】:

我正在搜索一个 LINQ 查询,其中有 3 个参数,其中两个是可选参数,我为此编写了 if-else 条件,如下所示

if (id != null)  where condition 
else if (name!= null)  where condition  
else if (category != null)  where condition  
else if (id != null && name != null)  where condition  
else if (id != null && category != null)  where condition  
else if (name != null && category != null) where condition 
else if (id != null && name != null && category != null )  where condition  

如果再添加一个可选参数,我不想写更多的if-else条件

注意。 id 不是主键

【问题讨论】:

那是..有效?!? 无论如何,我想你可能正在寻找类似 Where(x => (q == null || x.q == q) && ..) 的东西;也就是说,防护装置移动到过滤器内部。否则 CHAIN 过滤器:f = ..; if (q != null) f = f.Where(x => x.q == q); 作为可选参数本身是无关紧要的。 【参考方案1】:

EF 中的最佳模式是仅有条件地添加 Where 条件。 EG

IQueryable<SomeType> qry = ...;
if (id != null)

  qry = qry.Where(x => x.Id == id);

if (name != null)

  qry = qry.Where(x => x.Name == name);

if (category != null)

  qry = qry.Where(x => x.Category == category);

var results = qry.ToList();

这样你就不会用许多不做任何事情的谓词弄乱表达式,但这会弄乱查询执行。

【讨论】:

【参考方案2】:

你可以这样写

id == null ? true : id condition &&
name == null ? true : name condition &&
category == null ? true: category  and other conditions

或者

id == null || id condition &&
id == null || id condition &&

如果它的值等于 null,则返回 true 将使语句为 true。 它干净,易于理解和开发。

希望对你有帮助。

【讨论】:

【参考方案3】:

我总是在下面做。易于阅读和记忆。

myList
    .Where(x => id == null || x.Id == id)
    .Where(x => name == null || x.Name == name)
    .Where(x => category == null || x.Category == category);

【讨论】:

以上是关于在 C# linq 中结合多个具有可选参数的 where 条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

SQL - 创建具有多个可选参数的存储过程

在 c# 中将 WhereIf 用于多个条件

C# 4.0:我可以使用 TimeSpan 作为具有默认值的可选参数吗?

c#基础并行Linq

具有多个可选参数的控制台输出