Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果可能,将多个if条件合并到单个LINQ语句中_C#_Asp.net Mvc_Linq_Ef Code First - Fatal编程技术网

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

C# 如果可能,将多个if条件合并到单个LINQ语句中,c#,asp.net-mvc,linq,ef-code-first,C#,Asp.net Mvc,Linq,Ef Code First,我目前正在使用ASP.NET MVC和实体框架代码,首先使用repository模式显示具有分页功能的用户的简单列表。我添加了过滤列表的功能,允许最终用户从两个下拉列表和两个带有开始和结束日期的文本框中选择条件 有没有比下面的代码更好的方法来实现这一点,在下面的代码中,我必须测试所有可能的参数组合,以便编写适当的LINQ查询: public IEnumerable<User> GetAllByCondition(int? condition1, int? condition2, Da

我目前正在使用ASP.NET MVC和实体框架代码,首先使用repository模式显示具有分页功能的用户的简单列表。我添加了过滤列表的功能,允许最终用户从两个下拉列表和两个带有开始和结束日期的文本框中选择条件

有没有比下面的代码更好的方法来实现这一点,在下面的代码中,我必须测试所有可能的参数组合,以便编写适当的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
}
public IEnumerable GetAllByCondition(int?condition1、int?condition2、DateTime?startDate、DateTime?endDate)
{
if(条件1.HasValue&&startDate.HasValue&&endDate.HasValue)
{
返回Database.Set()。其中(x=>x.Condition1==Condition1.Value&&x.Date>startDate.Value&&x.Date x.Condition1==Condition1.Value&&x.Condition2==Condition2.Value)。ToList();
}
if(条件1.HasValue)
{
返回Database.Set().Where(x=>x.Condition1==Condition1.Value).ToList();
}
……还有很多
}

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

使用查询构成的事实-您可以继续调用
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();
var query=Database.Set();
if(条件1.HasValue)
{
query=query.Where(x=>x.Condition1==Condition1.Value);
}
if(条件2.HasValue)
{
query=query.Where(x=>x.Condition2==Condition2.Value);
}
...
返回query.ToList();

+1。这真是太棒了,现在就用几个月吧。这才是LINQ真正的奇迹——没有测试附加,没有超级条件的高效queiris。谢谢Jon,但这与我的例子不是很相似吗。我认为你的例子读起来更好,但我试着看看是否有一种方法可以更进一步,远离所有的if语句。我甚至不确定这是否可能,但值得一提。Jon Skeet的例子不仅读起来更好,而且适用于所有条件的组合,每个条件只有一个if语句。您的方法将需要更多的if语句。(+1表示jonskeet)Jon,这将使用AND语句附加到查询中。我该如何使用OR语句来追加查询?@Thomas:如果condition1.HasValue首先为true,如果语句执行,则在代码中使用
PredicateBuilder
,否则,如果语句未执行,为什么要编写此代码?这只是为了说明一点。我编辑了它。