如果可能,将if条件合并到单个LINQ语句中

时间:2011-11-16 16:02:16

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

我目前正在使用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
}

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

1 个答案:

答案 0 :(得分:13)

使用查询撰写的事实 - 您可以继续调用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();