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);
}
有。
你想说:如果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允许您在许多不同的行中构建它,而不是像您在代码示例中所做的那样在单个行中构建。