Невозможно преобразовать запрос SQL в Entity Framework Core - PullRequest
0 голосов
/ 06 апреля 2020

Я не могу преобразовать свой запрос 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();

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете разделить запрос на два запроса.

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();
...