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

Posted

技术标签:

【中文标题】无法将 SQL 查询转换为 Entity Framework Core【英文标题】:Unable to convert SQL query to 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/… 【参考方案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

以上是关于无法将 SQL 查询转换为 Entity Framework Core的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Sql 查询转换为 Linq 及其在 Entity Framework Core 中的 Join() 方法的等价物

如何将复杂的 SQL 查询转换为 JPQL?

将Json反序列化为Entity Framework无法将int转换为type

无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.Objects.ObjectQuery”

我无法将 SQL 选择查询结果转换为位

无法将 MS Sql 查询转换为 Hibernate @Query