Extrahieren Sie eine stark typisierte Datenkontextinstanz aus einer beliebigen Abfrage

8

Hintergrund

Wir haben eine Klassenbibliothek mit einem Grid (erbt von WPF DataGrid) mit Refresh-Funktionalität. Das Grid hat eine Eigenschaft IQueryable Query , die die Aktualisierung aktiviert. Die Abfrage jedes Rasters ist nicht in der Klassenbibliothek definiert, sondern im referenzierenden Endprojekt:

%Vor%

Jedes Raster hat auch ein Textfeld für die Textfilterung. Wenn Text in den Filter eingegeben wird, wird ein Ausdruck generiert, der überprüft, ob eine String-Eigenschaft oder eine String-Convertible-Eigenschaft (mit SqlFunctions.StringConvert ) die Filterzeichenfolge enthält. Der Ausdruck wird dann als Argument an Where an die ursprüngliche Abfrage angehängt, und daher werden nur die Datensätze zurückgegeben, die übereinstimmende Zeichenfolgen enthalten.

%Vor%

In einigen Fällen wird die Filterlogik in Endprojekten für den Entitätstyp definiert. Zum Beispiel:

%Vor%

Dieser Ausdrucksbaum verwendet eine Instanz des projektspezifischen Kontextes, die sich von der ursprünglichen Abfrage unterscheidet. Abfragen können keine Komponenten aus mehreren Kontexten verwenden (zumindest nicht in Entity Framework). Ich kann den Ausdrucksbaum so umschreiben, dass er eine bestimmte Instanz verwendet, aber ich muss die ursprüngliche Instanz aus der Abfrage extrahieren.

Es scheint offensichtlich, dass die Abfrage einen Verweis auf die Kontextinstanz enthält, andernfalls würde die Abfrage keine Ergebnisse liefern können.

Ich möchte die Context-Instanz nicht an die Klassenbibliothek übergeben.

Daher:

Wie bekomme ich eine Abfrage mit der stark typisierten DbContext -Instanz, die zum Erstellen der Abfrage verwendet wurde?

Mit anderen Worten, was im Körper dieser Methode steckt:

%Vor%     
Zev Spitz 29.09.2016, 13:29
quelle

2 Antworten

2
  

Es scheint offensichtlich, dass die Abfrage einen Verweis auf die Kontextinstanz enthält, andernfalls würde die Abfrage keine Ergebnisse liefern können.

Das stimmt, aber es sind implementierungsspezifische Details und in EF ist es in interne Member / Klassen / Interfaces gekapselt.

Auch wenn berücksichtigt wird, dass DbContext auf dem ObjectContext aufgebaut ist, ist das Halten eines Verweises auf DbContext nicht unbedingt notwendig. Zum Glück ist das nicht der Fall:)

Im Folgenden werden Reflektions- und Implementierungsdetails des neuesten EF6.1.3 verwendet (getestet und funktioniert, wenn Sie keine Drittanbieter-Erweiterungen wie LinqKit und ähnliche, die den Abfrageanbieter ersetzen):

%Vor%     
Ivan Stoev 06.10.2016, 20:39
quelle
0

Ich würde empfehlen, eine Instanz von MyDataContext in Ihre Abfragefunktion zu übergeben

%Vor%

Damit können Sie in der aufrufenden Funktion Folgendes tun:

%Vor%

d. Sie können die Filterung auf die Ebene über der Datenzugriffsklasse bringen.

Manche Leute mögen das nicht gerne. Sie können den Rat bekommen, dass es am besten ist, alle entityframeowrk-Funktionalität innerhalb derselben Ebene zu behalten und nur das DTO zurückzugeben. Ich mag den obigen Ansatz jedoch. Es hängt davon ab, wer in Zukunft jeden Teil Ihrer Bewerbung bearbeiten muss.

Hoffe das hilft zumindest

    
ChrisOBrien 13.10.2016 11:06
quelle