2017-07-28 5 views
0

Ich versuche, eine LINQ-Abfrage in einer MVC-Anwendung zu schreiben, die Benutzern ermöglicht, mehrere Felder gleichzeitig nach residenten Informationen zu durchsuchen.LINQ-Zuordnung für mehrere Spalten

Hier ist ein Beispiel für das, was ich erreichen möchte.

Der Benutzer hat drei Textfelder aus suchen:

@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" /> 
} 

Können sagen wir folgendes in unserer Tabelle haben:

--------------------------------------------------------------- 
|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 | 

Meine LINQ-Abfrage jetzt ist als solche:

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

Angenommen, der Benutzer sucht nach Vorname: "Joe" Nachname: "Doe", um alle Joe Does in der Stadt zu finden. Die Abfrage wird jetzt ALLE "Joe" s und ALLE "Doe" s zurückgeben.

Was müsste ich tun, damit es nur das "Joe Does" zurückgibt?

Antwort

4

Statt eine Gesamt oder Suche || zu tun, es klingt wie Sie && eine und suchen wollen. Aber Ihr Test für leere Suchzeichenfolgen ist falsch - Sie möchten sagen, dass ein Datensatz übereinstimmt, wenn (Suchzeichenfolge ist null) ODER (Suchzeichenfolge ist eine Übereinstimmung).

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

Es sieht aus wie Sie OR -ing Ihre Suchbegriffe zusammen sind, wenn Sie sie wirklich AND wollen.

Versuchen Sie Ihre Anfrage Aufbau bedingt separaten Where Klauseln für jede Kriterien Anwendung:

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

Dies sollte Ihnen die gewünschten Ergebnisse, während auch ein wenig leichter Grund, über den Code zu machen.

Verwandte Themen