Vì vậy, đây là thỏa thuận - Tôi hiện đang sử dụng EF Core 3.1 và giả sử tôi có một thực thể:
public class Entity
{
public int Id { get; set; }
public int AnotherEntityId { get; set; }
public virtual AnotherEntity AnotherEntity { get; set; }
}
Khi tôi truy cập DbSet<Entity> Entities
theo cách thông thường, tôi bao gồm AnotherEntity như:
_context.Entities.Include(e => e.AnotherEntity)
và điều này hoạt động. Tại sao không, phải không? Sau đó tôi đi với:
_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)
và điều này cũng hoạt động. Cả hai trả lại cho tôi cùng một bộ sưu tập các đối tượng được tham gia với AnotherEntity. Sau đó, tôi sử dụng một thủ tục được lưu trữ bao gồm cùng một truy vấn SELECT * FROM Entities
có tên spGetEntities:
_context.Entities.FromSqlRaw("spGetEntities")
đoán xem cái gì Điều này cũng hoạt động. Nó mang lại cho tôi cùng một đầu ra nhưng rõ ràng không tham gia AnotherEntity. Tuy nhiên nếu tôi cố gắng thêm Bao gồm như thế này:
_context.Entities.FromSqlRaw("spGetEntities").Include(e => e.AnotherEntity)
Tôi đang nhận được:
FromSqlRaw hoặc FromSqlInterpiated đã được gọi với SQL không thể tổng hợp và với một truy vấn sáng tác trên nó. Xem xét việc gọi
AsEnumerable
sau phương thức FromSqlRaw hoặc FromSqlInterpiated để thực hiện thành phần ở phía máy khách.
Mặc dù đầu ra của _context.Entities.FromSqlRaw("SELECT * FROM Entities")
và _context.Entities.FromSqlRaw("spGetEntities")
là giống hệt nhau.
Tôi không thể tìm thấy bằng chứng rằng tôi có thể hoặc tôi không thể làm điều này với EF Core 3.1 nhưng nếu ai đó có thể cho tôi bất kỳ gợi ý nào về khả năng của phương pháp này thì sẽ rất tuyệt.
Ngoài ra nếu có một cách khác để có được các thực thể tham gia bằng cách sử dụng thủ tục được lưu trữ, tôi có thể chấp nhận nó như là giải pháp cho vấn đề của mình.