无法将 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() 方法的等价物
将Json反序列化为Entity Framework无法将int转换为type
无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.Objects.ObjectQuery”