2017-07-28 84 views
0

我想在一個MVC應用程序中編寫一個LINQ查詢,該應用程序允許用戶同時搜索多個字段以查找駐留信息。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」,我需要做些什麼?

回答

4

而不是做一個整體搜索||的,這聽起來像你想的搜索&&。但是你對空搜索字符串的測試是錯誤的 - 你想說如果(搜索字符串爲空)或(搜索字符串是匹配)記錄匹配。

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))); 
3

看起來你是OR -ing您的搜索字詞在一起的時候你真的想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)); 
} 

這應該給你想要的,同時也使代碼更容易一點的推理結果。