【问题标题】:Consolidate many if conditions to a single LINQ statement if possible如果可能,将许多 if 条件合并到单个 LINQ 语句
【发布时间】:2011-12-30 13:55:52
【问题描述】:

我目前正在使用 ASP.NET MVC 和 Entity Framework Code First 使用存储库模式来显示具有分页的用户的简单列表。我通过允许最终用户从两个下拉列表和两个带有开始和结束日期的文本框中选择条件来添加过滤该列表的功能。

有没有比下面的代码更好的方法,我必须测试所有可能的参数组合才能编写适当的 LINQ 查询:

public IEnumerable<User> GetAllByCondition(int? condition1, int? condition2, DateTime? startDate, DateTime? endDate)
{
    if (condition1.HasValue && startDate.HasValue && endDate.HasValue)
    {
        return Database.Set<User>().Where(x => x.Condition1 == condition1.Value && x.Date > startDate.Value && x.Date <= endDate.Value).ToList();
    }

    if (condition1.HasValue && condition2.HasValue)
    {
        return Database.Set<User>().Where(x => x.Condition1 == condition1.Value && x.Condition2 == condition2.Value).ToList();
    }

    if (condition1.HasValue)
    {
        return Database.Set<User>().Where(x => x.Condition1 == condition1.Value).ToList();
    }

    .... and the list goes on
}

如果我以后再添加一个条件,这很快就会变得臃肿。

【问题讨论】:

  • 在你的代码中 if condition1.HasValue 只在第一个 if 语句执行时才为真,否则没有一个 if 语句没有执行,为什么要写这段代码?
  • 只是为了说明一点。我编辑了它。

标签: c# asp.net-mvc linq ef-code-first


【解决方案1】:

使用查询组合这一事实 - 您可以继续调用 Where 以添加更多条件:

var query = Database.Set<User>();

if (condition1.HasValue)
{
    query = query.Where(x => x.Condition1 == condition1.Value);
}
if (condition2.HasValue)
{
    query = query.Where(x => x.Condition2 == condition2.Value);
}
...
return query.ToList();

【讨论】:

  • +1。这太棒了——现在可以使用几个月了。这是 LINQ 的真正奇迹 - 无需附加测试,无需多余条件即可高效查询。
  • 感谢 Jon,但这与我的示例不太相似。我认为你的例子读起来更好,但我想看看是否有办法让它更进一步,远离所有 if 语句。我什至不确定这是否可能但值得提问。
  • Jon Skeet 的示例不仅读起来更好,而且它适用于所有条件组合,每个条件只有一个 if 语句。您的方法将需要更多的 if 语句。 (乔恩·斯基特 +1)
  • Jon,这将使用 AND 语句附加到查询中。我将如何使用 OR 语句来追加查询?
  • @Thomas:你会使用PredicateBuilder - albahari.com/nutshell/predicatebuilder.aspx
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2013-12-17
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多