【问题标题】:Unable to convert SQL query to Entity Framework Core无法将 SQL 查询转换为 Entity Framework Core
【发布时间】:2020-07-18 01:19:42
【问题描述】:

我无法将我的 SQL 查询转换为 Entity Framework Core。

SQL 查询是:

select * 
from tests 
join TestParameters on (tests.Id = TestParameters.TestId) 
join PatientTests on (Tests.Id = PatientTests.TestId) 
where PatientId = 3

模型如下所示:

public class Tests
{
    [Key]
    public int Id { get; set; }

    [Required]
    [Display(Name = "Test Name")]
    public string TestName { get; set; }

    [Display(Name = "Short Name")]
    public string  ShortName { get; set; }

    [Display(Name="Technical Name")]
    public string  TechName { get; set; }

    [Required]
    [Display(Name ="Test Price")]
    public float TestPrice { get; set; }

    [Display(Name = "Sub Department")]
    public int SubDeptId { get; set; }

    [Display(Name = "Center")]
    public int CenterId { get; set; }

    public string Separate { get; set; }

    [Display(Name = "Sub Department")]
    [ForeignKey("SubDeptId")]
    //relation of departments table
    public virtual SubDepartments subDepartments { get; set; }

    [Display(Name = "Centers")]
    [ForeignKey("CenterId")]
    //relation of departments table
    public virtual Centers centers  { get; set; }
}

public class TestParameter
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Categories { get; set; }

    [Required]
    [Display(Name = "Test Parameter Name")]
    public string ParameterName { get; set; }

    [Required]
    public string Unit { get; set; }

    [Display(Name ="Decimal Point")]
    public int DecimalPoint { get; set; }

    [Display(Name = "Help Value")]
    public string HelpValue { get; set; }

    [Display(Name = "Normal Range")]
    public string NormalRange { get; set; }

    public string Minimum { get; set; }

    public string Maximum { get; set; }

    [Display(Name="Test Footer")]
    public string TestFooter { get; set; }

    [Display(Name = "Tests Name")]
    public int TestId { get; set; }

    [ForeignKey("TestId")]
    //relation of departments table
    public virtual Tests Tests { get; set; }
}

public class PatientTest
{
    [Key]
    public int Id { get; set; }

    [Display(Name ="Patient Id")]
    public int PatientId { get; set; }

    [Display(Name ="Test Id")]
    public int TestId { get; set; }

    [Display(Name ="Doctor")]
    public int DoctorId { get; set; }

    [Display(Name="Center")]
    public int CenterId { get; set; }

    [Display(Name = "Test")]
    [ForeignKey("TestId")]
    //relation of Tests table
    public virtual Tests Tests { get; set; }

    [Display(Name = "Doctor Reference")]
    [ForeignKey("DoctorId")]
    //relation of Doctors table
    public virtual Doctors Doctors { get; set; }

    [Display(Name = "Center Reference")]
    [ForeignKey("CenterId")]
    //relation of Centers table
    public virtual Centers Centers { get; set; }

    [Display(Name = "Patient")]
    [ForeignKey("PatientId")]
    //relation of Patient table
    public virtual Patient Patient { get; set; }
}

PatientTests 包含患者、测试、测试参数的关系。

我尝试转换它,但它返回单个数据。

我的代码是:

var test = await _db.TestParameters
                    .Include(p => p.Tests)
                    .Where(p => p.Tests.Id == pttp.patient.Id)
                    .ToListAsync();

【问题讨论】:

  • 当您使用导航属性时(因为您没有正确实现它),您不需要检查加入参数。所以.Where(p=>p.Tests.pttp.patient.Id==3)。我强烈推荐阅读本教程:entityframeworktutorial.net/efcore/…

标签: entity-framework asp.net-core entity-framework-6 entity-framework-core asp.net-core-2.0


【解决方案1】:

您可以将查询拆分为两个查询。

1) 选择患者测试

var patientTests = _db.PatientTests
    .Include(x => x.Test)
    .Where(x => x.PatientId == pttp.parient.Id)
    .ToList();

2) 选择测试参数

var testIds = patientTests.Select(x => x.TestId).ToList();
var testParameters = _db.TestParameters
    .Where(x => testIds.Contains(x.TestId))
    .ToList();

【讨论】:

  • 谢谢马丁先生,我需要更多帮助,我想重新安排它与父子关系测试是父项,TestParameter 是测试的子项,例如 Test1 TestPara1 TestPara2 TestPara3 Test2 TestPara1 TestPara2 TestPara3
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2011-11-15
  • 2021-05-08
  • 2017-10-23
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多