2017-07-28 9 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をすべて検索できます。クエリは、今すぐすべての "ジョー"と "Doe"のすべてを返します。

「Joe Does」のみを返すためには、何をする必要がありますか?

答えて

4

代わりの全体的なまたは検索||をやってあなたは検索&&をしたいのように、それが聞こえます。しかし、空の検索文字列のテストは間違っています。つまり、(検索文字列がヌル)OR(検索文字列が一致)の場合、レコードが一致するとします。

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

あなたが実際にそれらをANDしたいときに一緒に検索用語をOR -ingているように見えます。

は条件付きで各基準について別々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)); 
} 

も程度の理由で少し楽にコードをしながらこれは、あなたが望む結果を与える必要があります。