Lets sagen, dass ich eine Klasse wie dieses:Was ist die empfohlene Methode in verketteten Spalten zu suchen?
class Person
{
string FirstName;
string MiddleName;
string LastName;
}
sagen Lets ich diese Beispieldaten haben:
William Henry Gates
Steven Paul Jobs
Mark Elliot Zuckerberg
Dann in Entity Framework/Linq ich Suchanfragen wie dies tun können:
string search = "paul";
search = search.ToUpper();
var people = db.People
.Where(p => p.FirstName.ToUpper().Contains(search)
.Where(p => p.MiddleName.ToUpper().Contains(search)
.Where(p => p.LastName.ToUpper().Contains(search);
Das funktioniert großartig. Aber dann, wenn der Benutzer Suche nach, mit gutem Beispiel:
search = "Henry Gates";
Oops .. in der Theorie, diese (1) arbeiten müssen:
.Where(p => (p.FirstName +" "+ p.MiddleName +" "+ p.LastName).ToUpper().Contains(search);
Oder diese (2) muss arbeiten :
.Where(p => (p.FirstName.ToUpper() +" "+ p.MiddleName.ToUpper() +" "+ p.LastName.ToUpper()).Contains(search);
und es gibt eine Option(3) ich denke, kann:
.Select(p => new {FullName = p.FirstName +" "+ p.MiddleName +" "+ p.LastName)})
.Where(p => p.FullName.Contains(search))
Endlich meine Frage. In kleinen Tabellen ist dies nicht so wichtig, aber in großen Tabellen (wie 500k Datensätze) kann es ein Problem sein, weil (in meinem Beispiel) FirstName, MiddleName und LastName indizierte Felder sind, und die Suche in jedem Feld separat ist aber in Ordnung Bei der Verkettung der Felder in Abfragen führt die SQL-Abfrage vollständige Tabellendurchsuchungen statt der Verwendung von Indizes durch, wodurch eine einfache Abfrage sehr langsam wird.
Die Verwendung von EntityFramework/Linq ist noch komplexer, weil ich nicht genau weiß, welche Kriterien zum Verketten meiner Felder verwendet werden.
Dann was ist der empfohlene Weg in verketteten Spalten zu suchen?
Vielen Dank für jede Hilfe
Nur neugierig, muss "Henry Gates" gleich "MiddleName + Nachname" sein? oder es kann "MiddleName = Henry Gates" sein? oder es kann "MiddleName = Gates, LastName = Henry" sein, was bedeutet, dass die Position nicht relevant ist? Wenn ja, dann wandle vielleicht die "Henry Gates" in ein Array um und 'Where (p => searchArray.Contains (p.FirstName) || ... || ...)' – Prisoner
@Prisoner ist gleich "MiddleName + LastName ". aber position ist nicht relevant, aber nicht erforderlich ... wenn "Gates Henry" gefunden wird kann ich als Bonus sehen –