2016-03-31 7 views
1

Ich versuche, eine generische Methode mit Prädikat zu implementieren. Ich schrieb einig Code:Abrufen von Elementen durch übereinstimmende Prädikatmethode

public ICollection<T> GetProductsByMatching<T>(Expression<Func<T, bool>> predicate) 
{ 
    return context.Products.Where(predicate).Include("ShopPlace, Images").ProjectTo<T>().ToList(); 
} 

und Verwendung dieser Methode:

var a = service.GetProductsByMatching<ProductInfo>(x => x.Name.StartsWith("value") 
     || x.Price < 150); 

Endlich habe ich Invalid Operation Exception: Keine generische Methode 'Wo' vom Typ 'System.Linq.Queryable' ist kompatibel mit die übergebenen Argumente und Argumente des Typs.

Was ist falsch an meinem Code? Danke für den Fortschritt!

+0

Weil 'T' ='-Produkt mit. Was soll dieser Code tun? Meinst du context.Set 'statt? – CodeCaster

+0

@CodeCaster Produkte aus der Datenbank nach Prädikat erhalten und zu ProductInfo (ViewModel Klasse) zuordnen – user3818229

+0

Ja, _that_ Teil ist offensichtlich aus dem Code, aber ich versuche herauszufinden, warum Sie 'Expression >' in der erster Platz. In meiner Antwort habe ich nun einige Annahmen basierend auf dem Methodennamen getroffen. – CodeCaster

Antwort

3

Das Prädikat in context.Products.Where(predicate) kann natürlich nur ein Expression<Func<Product, bool>>, keine Expression<Func<T, bool>>, sein, da es keine Garantie gibt, dass T ein Product ist.

Sie versuchen, auf die ein Prädikat auf dem Zieltyp zu filtern, während die Filterung auf dem Quelltyp auftreten müssen:

public ICollection<T> GetProductsByMatching<T>(Expression<Func<Product, bool>> predicate) 
{ 
    return context.Products.Where(predicate) 
          .Include("ShopPlace, Images") 
          .ProjectTo<T>() 
          .ToList(); 

} 
+0

Ich vermutete so. Aber ich möchte keine Links zur 'Product' Klasse im Methodennutzungsumfang haben. Es ist möglich, eine Funktion zu schreiben, um Produkte nach 'ProductInfo' zu filtern. – user3818229

+0

Das ist eine ganz andere Frage. Dies ist mit ProductInfo nicht möglich (da diese Klasse keine Beziehung zum Produkt hat und Eigenschaften enthalten kann, die Ihr Produkt nicht enthält, sodass Ihr Ausdruck nicht in nicht vorhandene Spalten in Ihrer Datenbank übersetzt werden kann). Sie könnten eine Schnittstellenschicht hinzufügen, auf der die Benutzer die Schnittstelle abfragen, und Sie wenden diese Schnittstelle auf Ihre Entitätsmodelle an. – CodeCaster

+0

Gibt es eine Möglichkeit, Quellprädikat basierend auf 'ProductInfo' Klasse in' Product' Klasse umzuwandeln/ändern/zuordnen, wenn ich bin sicher über identische Eigenschaften. Ich meine, den Ausdruck zu speichern, aber das Prädikat auf einen anderen Typ zu übertragen. – user3818229

Verwandte Themen