Sagen wir, dass ich eine bestimmte Art habe zu entscheiden, ob einige Strings "übereinstimmen", so:
%Vor%Ich möchte mit Linq To Entities und diesem Helfer Matches aus einer Datenbank ziehen. Allerdings, wenn ich das versuche:
%Vor%Ich bekomme "LINQ to Entities erkennt die Methode nicht ..."
Wenn ich den Code wie folgt umschreibe:
%Vor%Was logisch äquivalent ist, dann funktionieren die Dinge gut. Das Problem ist, dass der Code nicht so lesbar ist, und ich muss ihn für jede andere Entität, die ich abgleichen möchte, neu schreiben.
So weit ich kann sagen von Fragen wie dieser eine , was ich tun möchte, ist im Moment unmöglich, aber ich hoffe, dass ich etwas verpasse, oder?
Mit einer frei verfügbaren Bibliothek namens LINQKit (wie von @Eranga erwähnt) wird diese Aufgabe zumutbar. Mit LINQKit sieht der Code wie folgt aus:
%Vor%Und muss so aufgerufen werden (beachten Sie den Aufruf AsExpandable ())
%Vor%Die magischen Teile sind die searchIn.Invoke (e) -Aufrufe und die Verwendung von AsExpandable (), die eine Wrapper-Ebene hinzufügt, die es ihnen ermöglicht, zu arbeiten.
Das Bit AsExpandable () wird vom ursprünglichen Autor hier ausführlich erklärt.
Beachten Sie, dass ich bei einigen Details von Ausdrücken immer noch etwas verschwommen bin, also fügen Sie bitte einen Kommentar hinzu / bearbeiten Sie diese Antwort, wenn sie besser / kürzer / klarer gemacht werden kann.
Wenn alle ‚blahs‘ (Klassen), die Sie haben die gleiche Struktur Filterung wird, können Sie eine einfache Methode, wie diese verwendet werden. Der wesentliche Unterschied besteht darin, dass es einen Ausdruck gibt, dass Linq Lage sein sollte, zu analysieren und es bringt in der gesamten Instanz und Filter auf Namen statt bringt nur die Zeichenfolge Namen in.
%Vor%Sie können diese Methode wie folgt verwenden:
%Vor%Das setzt voraus, dass alle Ihre Klassen, für die Sie filtern möchten, eine Schnittstelle implementieren, beispielsweise:
%Vor%Wenn Sie nach verschiedenen Eigenschaften filtern wollen, dann können Sie das nicht mit einfachem Code wie diesem machen. Ich glaube, Sie brauchen den Ausdruck selbst mit Reflexion (oder mit Hilfe einer Bibliothek, die Reflexion verwendet) zu bauen -. Es ist immer noch möglich, aber viel schwieriger
Edit: Es klingt wie Sie dynamische Verhalten benötigen, so lieh ich mir eine gewisse Logik von dtb 's Antwort auf diese Frage und kam up mit diesem:
%Vor%Sie würden es wie:
verwenden %Vor%Es ist lang und weitschweifig, aber Sie können sehen, wie es auf die ursprüngliche Methode in geraden C # -Code geschrieben ähnlich ist. Hinweis: Ich habe diesen Code nicht getestet, daher könnte es ein paar kleine Probleme geben - aber das ist die allgemeine Idee.
Tags und Links c# entity-framework linq-to-entities