Linq查询数据库动态where参数

本文关键字:where 参数 动态 数据库 查询 Linq | 更新日期: 2023-09-27 18:15:34

我有一个关于城市的数据表:在搜索输入框中,用户输入任意数量的字符,然后按下"搜索"按钮。还有另一个字段,用户可以通过下拉列表输入状态。

按下搜索按钮触发对服务器控制器的ajax调用,该服务器控制器接收名称的起始字符和状态的两个字符。

控制器应该返回名称以提供的字符开头的城市列表。如果传递了该州,则该列表应只包含名称以所提供的字符AND开头且位于该州的城市。

如果州未通过,则返回所有匹配的城市,而不考虑州。

我找不到一个方法来编写一个Linq语句,因为我不知道如何编写查询状态的部分:目前我这样做:

public ActionResult selectCity(string searchString, string stateCode)
{
    List<CityViewModel> mylist = new List<CityViewModel>();
    IQueryable<City> mycities = null;
    if (stateCode == "")
    {
        mylist = (from c in db.Cities
                    where c.name.StartsWith(searchString)
                    select c);
    }
    else
    {
        mylist = (from c in db.Cities
                    where ((c.name.StartsWith(searchString)) &&
                          (c.stateCode == stateCode))
                    select c);
    }
    <snip>
    .....
    .....
    </snip>
   return PartialView("_selComune",elenco);
}

Linq查询数据库动态where参数

有。

你想:如果stateCode是空的,或者它匹配City.stateCode,那么在结果中包括它,而且City.Name必须始终以searchString开头。在代码:

var mylist = 
    from c in db.Cities
    where 
        c.name.StartsWith(searchString) 
        && (stateCode == "" || c.stateCode == stateCode)
    select c;

大致相当于这个SQL(假设提供了语法正确的参数):

SELECT * FROM Cities
WHERE name LIKE @searchString AND (@stateCode = '' OR stateCode = @stateCode)

如果第一个条件总是满足,SQL Server将优化第二次比较(只需检查查询执行计划)。


子> <我认为这是一个打字错误编写代码的例子,但myList不是List<City>,除非你也添加ToList()到你的LINQ查询。>

Adriano Repetti的答案允许您编写单个查询来处理"可空"参数,但有时它具有性能缺陷,在SQL中转换为这种查询可能会阻止索引工作。

请注意,以下代码也可以在sql端工作并构建所需的查询,只需要在LINQ端多一点代码:

    mylist = (from c in db.Cities
              where c.name.StartsWith(searchString)
              select c);
    if (stateCode != "")
    {
        mylist = mylist.Where(c.stateCode == stateCode);
    }

这种结构不会取代以前的"where"内容,它会添加任何新的术语,并将它们与"and"操作符组合。

IQeryable允许您在许多不同的行中构建它,而不是像您在代码示例中所做的那样在单个行中构建。