Ich ändere meine EF LINQ-Abfrage in eine gespeicherte Prozedur. Gibt es eine einfache Möglichkeit, komplexe Zuordnungen einzurichten?

8

Ich habe ein Entity Framework-Projekt mit 5 separaten Tabellen. Wenn ich Daten aus diesen Tabellen abfrage und .Include() verwende, ist die erzeugte Abfrage extrem langsam und überschreitet das Zeitlimit.

Ich habe die Abfrage in eine gespeicherte Prozedur verschoben und suche jetzt nach einer Möglichkeit, diese gespeicherte Prozedur abzufragen und die zurückgegebenen Daten einfach den vorhandenen Datenklassen zuzuordnen.

Meine ursprüngliche Linq-Abfrage an den DataContext von EF sah folgendermaßen aus:

%Vor%

Es gibt ein Entity-Datenobjekt zurück, das diesem ähnelt:

%Vor%

Die Abfrage, die EF zur Ausführung auf dem SQL-Server generiert hat, hat eine Ergebnismenge zurückgegeben, die ungefähr so ​​aussieht:

%Vor%

(Es werden 1 B-Satz, 3 C-Sätze, 3 D-Sätze und 2 E-Sätze angenommen.

Ich habe diese Abfrage in einer Stored Procedure reproduziert und ihre Laufzeit auf praktisch nichts reduziert, jedoch stehe ich darauf, herauszufinden, wie die Ergebnismenge meiner Entity Framework-Datenklasse (Klasse A von oben) zugeordnet wird.

EF ist definitiv dazu in der Lage, da es bereits irgendwo hinter den Kulissen funktioniert, wenn ich die Linq-Abfrage verwende, aber ich bin mir nicht sicher, ob ich darauf Zugriff hätte.

Gibt es in Entity Framework eine einfache Möglichkeit, eine einzelne gespeicherte Prozedur (Function Import) einer mehrstufigen Entity Framework-Klasse zuzuordnen?

    
Rachel 17.01.2013, 17:51
quelle

3 Antworten

2

Ich habe einen Blogeintrag gefunden, der erklärt, wie dies mit Entity Framework gemacht werden kann.

Ссылка

Um es kurz zusammenzufassen, müssen Sie Ihre gespeicherte Prozedur schreiben, so dass sie Ihre Daten auf eine bestimmte Weise zurückgibt, die von Entity Framework erwartet wird, und dann können Sie einige EF-Erweiterungen , um die Ausführung Ihrer gespeicherten Prozedur anzupassen und Ihr Objektdiagramm zu materialisieren.

Es sieht so aus, als wäre es in zukünftigen Versionen (5.0+ glaube ich) in Entity Framework eingebaut, aber diese Lösung scheint für niedrigere Versionen zu funktionieren.

Obwohl ich in meinem Fall festgestellt habe, dass ich das .Include() in meiner Linq-Abfrage einfach losgeworden bin und manuell die anderen Eigenschaften durch Referenzieren im Code aufgerufen habe, bevor ich das Objekt zurücksende, wurde mein Problem mit der Leistung behoben. Dies liegt daran, dass statt einer einzigen massiven Abfrage zwischen den 5 Tabellen mit nicht optimierten Joins fünf separate Abfragen ausgeführt werden, die jeweils nur die spezifischen Daten abrufen, die sie benötigt.

    
Rachel 18.01.2013, 15:27
quelle
1

Wenn ich EntityFramework durch Umwandlung einer teuren Abfrage in eine gespeicherte Prozedur optimiere, erstelle ich eine benutzerdefinierte Klasse für die Ergebnisse und mache dann eine Logik im DbContext, um meine benutzerdefinierte Klasse in die Entitäten zu konvertieren.

Sie würden also etwas wie

erstellen %Vor%

Und dann in deinem DbContext

%Vor%     
Malcolm O'Hare 17.01.2013 18:02
quelle
0

Probieren Sie AutoMapper aus.

Sie würden etwas tun wie:

%Vor%

Solange die Eigenschaften in Ihren ReplyObjects.B mit den Namen und Typen von DataModel.B übereinstimmen, wird alles automatisch zugeordnet!

    
ScottRFrost 17.01.2013 18:11
quelle