带有未知参数数量的动态Where子句

本文关键字:动态 Where 子句 数数 未知 参数 | 更新日期: 2023-09-27 17:50:24

我一直在寻找这个问题的答案,但是一直没有找到一个符合我需要的答案。

下面的两个代码片段返回相同的东西,我没有偏好使用哪一个,我只是包括这两个,以防它帮助别人回答我的问题

private List<MyClass> GetMyClass(string name, string city, string state, string zip)
{
    using (MyEntities ctx = new MyEntities())
    {
        var results = from a in ctx.MyEntity
                      where (a.Name == name &&
                             a.City == city &&
                             a.State == state &&
                             a.ZIP == zip)
                      select a;
        return results.ToList();
    }
}
private List<MyClass> GetMyClass(string name, string city, string state, string zip)
{
    using (MyEntities ctx = new MyEntities())
    {
        var results = ctx.MyEntity.Where(a => a.Name == name)
                                  .Where(a => a.City == city)
                                  .Where(a => a.State == state)
                                  .Where(a => a.ZIP == zip)
                                  .Select(a => a);
        return results.ToList();
    }
}

在本例中,假设我有一个搜索屏幕,需要用户输入姓名和城市;State和ZIP为可选参数。查询必须至少搜索这两个字段,如果有必要,还必须搜索任何其他字段。

显然,在上面的例子中,如果用户只搜索Name和City,他们将得不到任何结果,因为查询将尝试匹配State == null和ZIP == null,因为没有提供这两个参数。

我如何重写这段代码,以只搜索已提供参数的字段?

带有未知参数数量的动态Where子句

你可以把它们串起来,像这样:

var results = ctx.MyEntity.AsQueryable();
if(name != null)
    results = results.Where(a => a.Name == name);
// ... snip ...
if(zip != null)
    results = results.Where(a => a.ZIP == zip)
return results.ToList();
var results = from a in ctx.MyEntity
              where ((a.Name == name || name == null) &&
                     (a.City == city || city == null) &&
                     (a.State == state || state == null) &&
                     (a.ZIP == zip) || zip == null)
              select a;