【问题标题】:Linq where clause with nullable parameters带有可为空参数的 Linq where 子句
【发布时间】:2018-12-05 18:45:05
【问题描述】:

我正在尝试执行可能具有可为空参数的 linq 查询。

这是我的 linq 调用

listOfControlsVM = db.Controls.Where((status == null || s.Status.Description == status) && (impact == null || s.Impact == impact)).ToList();

现在状态或影响都可以是可为空的参数(我还有两个,但我从示例中删除了它们)。使用这种方法,我的查询不会返回正确的结果集。

我想知道是否有其他更好的方法可以在 linq 中使用可为空的参数。例如,如果状态或影响有价值,则将它们包含在条件中,否则跳过它们。

【问题讨论】:

  • 您可以在 SO 上找到许多类似的问题/解决方案。链式Where 是我最喜欢的方法。但是您使用的方法是第二个可行的选择,那么真正行不通的方法是——您能举一个“查询没有返回正确的结果集”的例子吗?
  • 感谢您的回复@IvonStoev。我知道应该从数据库返回的结果数量,当我将它们与从 linq 查询返回的结果进行比较时,它们不匹配。如果值为空,我想要实现的是从 where 子句中完全排除参数。谢谢
  • 然后尝试chaining where clauses 方法。例如var query = db.Controls.AsQueryable(); if (status != null) query = query.Where(s => s.Status.Description == status); if (impact != null) query = query.Where(s => s.Impact == impact); 等。我很确定问题是重复的,这就是为什么不发布答案。
  • 生成的 SQL 是什么样的?

标签: entity-framework linq linq-to-sql linq-to-entities linq-to-objects


【解决方案1】:

有一个HasValue 可以检查nullable 变量上的空值而不是空值。

 listOfControlsVM = db.Controls.Where((!status.HasValue || s.Status.Description == status) && (!impact.HasValue || s.Impact == impact)).ToList();

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多