2017-05-16 2 views
0

Ich versuche, eine Methode zu erstellen, die durch eine IQueryable-Datenquelle mit einem generischen Typ gefiltert wird. Ich möchte eine Suchmethode haben, die ich für jede der Tabellen, die ich erstellen werde, wiederverwenden könnte. Am liebsten würde ich auch gerne einen Feldtyp in diesen eingeben, damit ich die Suche eingrenzen kann, aber es wäre mir auch egal, wenn nur in jedes Feld hineingeschaut würde.LINQ Where-Klausel mit Generic IQueryable Quelle

Bisher habe ich dies:

public static IQueryable<T> Search<T>(IQueryable<T> dataSource, string searchFor) 
{ 
    foreach(var variable in dataSource) 
    { 
     dataSource = dataSource.Where(var.Contains(searchFor)); 
    } 
} 

ich weiß nicht, ob dies wirklich möglich, aber es wäre mir eine Tonne Codierung sparen, da ich ein neues Suchverfahren für jede neue Tabelle implementieren müssen das würde ich sehen.

+0

Möchten Sie eine Suche auf einer oder mehreren Spalten aus der Tabelle basieren auf einem String-Namen einer Spalte. –

Antwort

0

Sie brauchen nicht for Schleife hier und haben Fehler in dieser Zeile:

dataSource = dataSource.Where(var.Contains(searchFor)); 

Sie Schnittstelle auf diese Weise definieren:

public interface IMyInterface 
{ 
    bool Contains(string searchFor); 
} 

und jetzt können Sie Ihre Funktion in den Schreib folgender Weg:

public static IQueryable<T> Search<T>(IQueryable<T> dataSource, string searchFor) where T:IMyInterface 
{ 

    return dataSource.Where(x=>x.Contains(searchFor)); 
} 
+0

Wird dies nur in alle Felder in dieser Datenquelle schauen? Und wenn ja, gibt es eine Möglichkeit, ein Feld anzugeben, in dem Sie suchen möchten? Vielleicht nur als Parameter übergeben? – Pinball125

+0

@ Pinball125 müssen Sie Enthält für jede Tabellenklasse implementieren, die Sie mit dieser Funktion verwenden möchten. Sie können das Feld in der Contains-Methode wie gewünscht angeben. LINQ Wohin geht die gesamte Sammlung, in der sie aufgerufen wurde, und gibt Elemente zurück, die die Anweisung übergeben haben. –

+0

Dies funktioniert nicht für die meisten IQueryable-Implementierungen. Dies ist für ein IEnumerable besser geeignet –

Verwandte Themen