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.