Ich habe einen WebAPI-Dienst mit einem SQL Server-Backend, der mit Entity Framework (Code-first) verwaltet wird. Ich habe Linq-Abfragen verwendet, um Daten aus der Datenbank abzurufen. Da einige meiner API-Endpunkte mehrere Joins durchführen, um Daten zu erhalten, habe ich bei der Bereitstellung in der Produktion Verzögerungen beobachtet. Ich lese mit ORM-Mapping vs direkte SQL-Abfragen (gespeicherte Prozeduren) und kam zu der Schlussfolgerung, dass für komplexe Abfragen optimal ist, gespeicherte Prozeduren zu verwenden.Endergebnis von gespeicherter Prozedur im Entity Framework zurückgeben
stieß ich auf einigen Artikel erklären, wie aus gespeicherten Prozedur zurückzuWertCode wie Verwendung:
context.Database.SqlQuery<T>(...)
jedoch alle Beispiele befassen dich mit einfacher SELECT
Abfrage und ja, ich mehr SELECT
Abfrage-Ergebnisse auch kam über Rückkehr auch. Aber in diesem Fall ist es 2 SELECT
Abfragen.
Im realen Szenario kann es mehr als 2 Select-Abfragen sein, da es sich um Joins und andere Codes handelt. Und am Ende der Abfrage werden wir nur die letzte SELECT
Abfrage ableiten, die die erwarteten Daten zurückgibt. Im Folgenden finden Sie eine Beispielcode Mock-up das Szenario zu erklären:
// Inside my stored procedure
Declare @XId uniqueidentifier
Declare @YId uniqueidentifier
// Some mockup queries. This can have JOINS and other complex codes in real code.
// Below code is made as simple as possible to explain the scenario
Select @XId=Id From Table1 Where Name = 'Name1'
Select @YId=Id From Table2 Where Code = 'Code1'
// This is the data, I am interested
Select * From Table3 Where [email protected] And [email protected]
Wie kann ich Zeilen aus dem letzten SELECT
Abfrage dieses Ziel zu erreichen?
Ich habe einige Nachforschungen angestellt und gehe davon aus, dass es mit EF nicht möglich ist, da die Unterstützung für gespeicherte Prozeduren minimal ist. Ist dies innerhalb von EF-Limits möglich oder muss ich dafür auf ADO.NET zurückgreifen?
Jede Hilfe wird geschätzt.
Danke.
@GertArnold - Ich habe Beispielcode-Schnipsel Erläuterung des Szenario hinzugefügt. – abhilashca
Ich denke, du solltest 'Select *' durch 'Select [deine tatsächliche Spaltenliste]' ersetzen, damit du tatsächlich weißt, mit was du arbeitest. Erstellen Sie dann einen Typ 'MyResultType', dessen Eigenschaften mit den ausgewählten Spalten übereinstimmen, und rufen Sie' context.Database.SqlQuery (...) 'auf. –
grek40
Ja, ich habe das schon ausprobiert, aber es wird nach 'Table1DTO' und nicht nach' Table3DTO' geworfen, was natürlich zu einem Casting-Fehler führt. – abhilashca