Nicht sicher, ob dies möglich ist oder ob ich richtig ausdrücke, wonach ich suche, aber ich habe folgendes Stück Code in meiner Bibliothek wiederholt und möchte etwas DRY üben. Ich habe eine Reihe von SQL Server-Tabellen, die ich basierend auf einem einfachen benutzerfreundlichen Suchfeld ala Google abfrage. Ich verwende LINQ, um die endgültige Abfrage basierend auf dem zu komponieren, was im Suchstring enthalten ist. Ich bin auf der Suche nach einer Möglichkeit, Generics und übergebene Lambda-Funktionen zu verwenden, um eine wiederverwendbare Routine daraus zu erstellen:
string[] arrayOfQueryTerms = getsTheArray();
var somequery = from q in dataContext.MyTable
select q;
if (arrayOfQueryTerms.Length == 1)
{
somequery = somequery.Where(
e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
foreach(string queryTerm in arrayOfQueryTerms)
{
if (!String.IsNullOrEmpty(queryTerm))
{
somequery = somequery
.Where(
e => e.FieldName.Contains(queryTerm));
}
}
}
Ich hatte gehofft, eine generische Methode mit einer Signatur zu erstellen, die so aussieht:
private IQueryable getQuery(
T MyTableEntity, string[] arrayOfQueryTerms, Func predicate)
Ich verwende dieselbe Suchstrategie für alle meine Tabellen, daher unterscheidet sich das einzige, was wirklich von der Verwendung zur Verwendung variiert, von der durchsuchten MyTable & MyTableEntity und dem durchsuchten Feldnamen. Macht das Sinn? Gibt es eine Möglichkeit, mit LINQ dynamisch den Namen des Feldes zu übergeben, das in der WHERE-Klausel abgefragt werden soll? Oder kann ich dies als Prädikat-Lambda übergeben?
e => e.FieldName.Contains(queryTerm)
Ich weiß, dass es eine Million Möglichkeiten gibt, dies in SQL zu tun, wahrscheinlich einfacher, aber ich würde es lieben, alles in der LINQ-Familie für diese eine Angelegenheit zu behalten. Außerdem denke ich, dass Generics für ein Problem wie dieses nützlich sein sollten. Irgendwelche Ideen?