LINQ匹配多列

时间:2017-07-28 19:52:54

标签: c# linq

我试图在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”?

2 个答案:

答案 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));
}

这应该可以为您提供所需的结果,同时使代码更容易理解。