我试图在MVC应用程序中编写LINQ查询,允许用户同时搜索多个字段以获取常驻信息。
这是我想要完成的一个例子。
用户有3个文本框可供搜索:
@using (Html.BeginForm("Index", "Voters", FormMethod.Get))
{
<p>
Last Name: @Html.TextBox("voterSearchModel.LastNameSearch", !String.IsNullOrEmpty(voterSearchModel.FirstNameSearch) ? voterSearchModel.FirstNameSearch : "")
First Name: @Html.TextBox("voterSearchModel.FirstNameSearch", !String.IsNullOrEmpty(voterSearchModel.LastNameSearch) ? voterSearchModel.LastNameSearch : "")
Address: @Html.TextBox("voterSearchModel.Address", !String.IsNullOrEmpty(voterSearchModel.LastNameSearch) ? voterSearchModel.AddressSearch : "")
</p>
<input type="submit" value="Search" />
}
假设我们在表格中有以下内容:
---------------------------------------------------------------
|FirstName | LastName | Address |
|Bob | Doe | 123 Sesame St. |
|Joe | Doe | 123 Sesame St. |
|Cookie | Monster | 111 FooBar Lane|
|Bob | Magoo | 321 Street Ave.|
|Mark | McAllister | 213 Duckie Ave.|
|Joe | Doe | 18 Sunset Blvd |
我的LINQ查询现在是这样的:
voters = voters.Where(voter => (voterSearchModel.LastNameSearch != null && voter.Last_Name.Contains(voterSearchModel.LastNameSearch))
|| (voterSearchModel.FirstNameSearch != null && voter.First_Name.Contains(voterSearchModel.FirstNameSearch)
|| (voterSearchModel.AddressSearch != null && voter.StreetNameComplete.Contains(voterSearchModel.AddressSearch)));
假设用户搜索名字:“Joe”姓氏:“Doe”以查找城市中的所有Joe Does。查询,现在将返回所有“Joe”和所有“Doe”。
我需要做什么才能让它只返回“Joe Does”?
答案 0 :(得分:4)
而不是进行整体或搜索||
,听起来您需要和搜索&&
。但是你对空搜索字符串的测试是错误的 - 你想说一条记录匹配if(搜索字符串为空)或(搜索字符串是匹配的)。
voters = voters.Where(voter => (voterSearchModel.LastNameSearch == null || voter.Last_Name.Contains(voterSearchModel.LastNameSearch)) &&
(voterSearchModel.FirstNameSearch == null || voter.First_Name.Contains(voterSearchModel.FirstNameSearch)) &&
(voterSearchModel.AddressSearch == null || voter.StreetNameComplete.Contains(voterSearchModel.AddressSearch)));
答案 1 :(得分:3)
当你真的想要OR
时,看起来你是AND
- 将你的搜索词放在一起。
尝试通过有条件地为每个条件应用单独的Where
子句来构建查询:
if (voterSearchModel.FirstNameSearch != null)
{
voters = voters.Where(voter.First_Name.Contains(voterSearchModel.FirstNameSearch));
}
if (voterSearchModel.LastNameSearch != null)
{
voters = voters.Where(voter.Last_Name.Contains(voterSearchModel.LastNameSearch));
}
if (voterSearchModel.AddressSearch != null)
{
voters = voters.Where(voter.StreetNameComplete.Contains(voterSearchModel.AddressSearch));
}
这应该可以为您提供所需的结果,同时使代码更容易理解。