首页 > 解决方案 > 如何使用原始 SQL 查询在 .net 核心中检索具有相关实体的实体?

问题描述

我有以下型号,Visit.csPrescription.cs. 我想获取包含相关处方的每个实例的所有访问行。我使用以下 EF Core 查询,但该medicines字段始终为空。我使用 postgresql 作为数据库。我应该怎么办?

访问.cs:

public class Visit
{
    public int patient_id { get; set; }
    public DateTime visit_date { get; set; }
    public int doctor_id { get; set; }
    public int prescription_id { get; set; }

    public ICollection<Prescription> prescriptions { get; set; }
}

处方.cs:

public class Prescription
{
    public int prescription_id { get; set; }
    public string medicine { get; set; }
    public Visit Visit { get; set; }
}

和我的查询:

var visits = dbContext.Visits
                      .FromSqlRaw("select * from visit natural join prescription")
                      .ToList();

标签: c#sqllinqasp.net-coreentity-framework-core

解决方案


文档在限制部分.FromSqlRaw提到了这一点

他们确实提供了一个示例,说明如何通过组合原始查询来包含相关数据:

var visits = dbContext.Visits
  .FromSqlRaw("select * from visit")
  .Include(v=>v.prescriptions)
  .ToList();

我还强烈建议您不要在任何查询中使用 *。列出您需要返回的列。使用 * 将导致数据库返回所有列,甚至是您不想要的列。强制数据库返回未使用的列可能会导致它不使用它本来可以使用的索引,或者导致数据库执行它确实不需要执行的行搜索。一个很好的例子是 DBA 为 CreateDate、UpdateDate、CreateUser、UpdateUser 和/或 RowVersion 等内容添加列,以帮助进行更改跟踪或复制。


推荐阅读