Suche über alle Felder einer Entität
Ich versuche, die Implementierung eines "omnibox"-Typ suchen, über eine Kunden-Datenbank, wo eine einzelne Abfrage sollte versuchen, entsprechen alle Eigenschaften eines Kunden.
Hier einige Beispiel-Daten, um zu verdeutlichen, was ich versuche zu erreichen:
FirstName | LastName | PhoneNumber | ZipCode | ...
--------------------------------------------------
Mary | Jane | 12345 | 98765 | ...
Jane | Fonda | 54321 | 66666 | ...
Billy | Kid | 23455 | 12345 | ...
- Wenn die Abfrage war
"Jane"
, würde ich erwarten, dass Zeile #1 zurückgegeben werden, sowie Zeile #2. - Eine Abfrage für
12345
würde die Ausbeute Zeilen #1 und #3.
Recht jetzt mein code sieht ziemlich viel wie folgt:
IEnumerable<Customer> searchResult = context.Customer.Where(
c => c.FirstName == query ||
c.LastName == query ||
c.PhoneNumber == query ||
c.ZipCode == query
//and so forth. Fugly, huh?
);
Dies offensichtlich funktioniert. Es riecht wirklich schlechte Praxis zu mir, obwohl, da jede änderung in der Person (entfernen von Eigenschaften, Einführung neuer Eigenschaften), brechen Zeug.
Also: gibt es da eine LINQ-foo, der Suche über alle Eigenschaften, gleich welcher Person, die ich um sich werfen?
- Konnte nicht Sie tun es mit der spiegelung?
- Wie würde ich gehen? Gerade erst mit c# und .net-Zeug ...
- ist das nicht eines der schönen Dinge zu haben? Wenn Sie entfernen einer Eigenschaft, erhalten Sie kompilieren Fehler.
- Aber er könnte auch wollen, dass es flexibel an den Punkt, wo er könnte noch mehr Eigenschaften, und es würde immer noch funktionieren, genau das gleiche. Daher, warum ich erwähnte Reflexion.
- Ich denke, das hängt davon ab, wie man es betrachtet. Ich würde lieber nicht haben, neu zu schreiben, alle meine Fragen jedes mal, wenn eine Eigenschaft Hinzugefügt wird, um eine Entität oder entfernt von einem. Auch Menschen neigen dazu, zu vergessen, das Zeug; eine Eigenschaft Hinzugefügt, um die Person, aber nicht auf die Abfrage nicht werfen Sie einen compiler-Fehler. Der compiler wird nicht die fehlerjäger für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
erste alle Eigenschaften innerhalb der Customer-Klasse mit dem gleichen Typ wie Abfrage:
dann finden alle Kunden aus dem Kontext, dass mindestens eine Eigenschaft mit Wert-Abfrage:
query
ist eigentlich ein string, da bin ich den Umgang mit denWebApi
. Deshalb, ich am Ende der Iteration über alle Eigenschaften (nicht nur Zeichenfolgen) und den Aufruf.ToString()
auf Sie (offensichtlich fangennull
Werte im Prozess). Die.Any
Teil sieht nun wie folgt aus:.Any(prop => ((prop.GetValue(customer, null) == null) ? "" : prop.GetValue(customer, null).ToString().ToLower()) == query)