Hier ist der Deal: Ich verwende derzeit EF Core 3.1 und nehme an, ich habe eine Entität:
public class Entity
{
public int Id { get; set; }
public int AnotherEntityId { get; set; }
public virtual AnotherEntity AnotherEntity { get; set; }
}
Wenn ich auf DbSet<Entity> Entities
normale Weise zugreife , füge ich AnotherEntity wie folgt hinzu:
_context.Entities.Include(e => e.AnotherEntity)
und das funktioniert. Warum sollte es nicht richtig sein? Dann gehe ich mit:
_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)
und das funktioniert auch. Beide geben mir dieselbe Sammlung von Objekten zurück, die mit AnotherEntity verbunden sind. Dann verwende ich eine gespeicherte Prozedur, die aus derselben Abfrage SELECT * FROM Entities
namens spGetEntities besteht:
_context.Entities.FromSqlRaw("spGetEntities")
erraten Sie, was? Das funktioniert auch. Es gibt mir die gleiche Ausgabe, aber natürlich ohne Joined AnotherEntity. Wenn ich jedoch versuche, das Include wie folgt hinzuzufügen:
_context.Entities.FromSqlRaw("spGetEntities").Include(e => e.AnotherEntity)
Ich bekomme:
FromSqlRaw oder FromSqlInterpolated wurde mit nicht zusammensetzbarem SQL und einer darüber erstellten Abfrage aufgerufen.
AsEnumerable
Ziehen Sie in Betracht, nach der FromSqlRaw- oder FromSqlInterpolated-Methode aufzurufen, um die Komposition auf der Clientseite durchzuführen.
Obwohl die Ausgabe von _context.Entities.FromSqlRaw("SELECT * FROM Entities")
und _context.Entities.FromSqlRaw("spGetEntities")
identisch ist.
Ich konnte keinen Beweis dafür finden, dass ich dies mit EF Core 3.1 kann oder nicht, aber wenn mir jemand einen Hinweis auf die Möglichkeit dieses Ansatzes geben könnte, wäre es schön.
Auch wenn es eine andere Möglichkeit gibt, verbundene Entitäten mithilfe einer gespeicherten Prozedur zu erhalten, würde ich dies wahrscheinlich als Lösung für mein Problem akzeptieren.
Antworten:
In Kürze können Sie das nicht tun (zumindest für SqlServer). Die Erklärung ist in der EF Core-Dokumentation - Raw SQL Queries - Composing with LINQ enthalten :
Da
Include
/ThenInclude
EF EF Core erforderlich istIQueryable<>
, istAsEnumerable
/AsAsyncEnumerable
etc. keine Option. Sie benötigen wirklich zusammensetzbares SQL, daher sind gespeicherte Prozeduren keine Option.Anstelle von gespeicherten Prozeduren können Sie jedoch TVF- (Table-Valued Functions) oder Datenbankansichten verwenden, da diese zusammensetzbar sind (
select * from TVF(params)
oderselect * from db_view
).quelle
In meinem Fall habe ich funktionierende EF
FromSql()
mit einem Code für gespeicherte Prozeduren 2.1 in 3.1 konvertiert . Wie so:Wo
AccountSums
ist ein SP.Das einzige, was ich tun musste, war zu verwenden
FromSqlRaw()
und hinzuzufügenIgnoreQueryFilters()
, damit es wieder funktioniert. Wie so:Dies wird in den Kommentaren erwähnt, aber das habe ich zunächst verpasst, also hier aufgenommen.
quelle