Linq многие ко многим запрос с предложением где - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующая проблема: у меня есть несколько таблиц "clini c", "doctor", "clinicDoctor" (представляющих взаимосвязь "многие ко многим"), также у меня есть "speciality" и "doctorSpecialty" (представляющие многие ко многим отношениям). Я хочу сделать запрос linq, чтобы найти все клиники, в которых есть врачи со специализацией c.

В резюме я хочу найти клиники по идентификатору специальности

var clinicLst = (from cli in clinica.Clinic
                                  .Include(x => x.ClinicDoctor) //This is a Collection
                                  .ThenInclude(x => x.IdDoctorNavigation)
                                  .ThenInclude(x => x.DoctorSpecialty) //This is a Collection
                                  .ThenInclude(x => x.IdSpecialtyNavigation)
                                  .Where(cli => (cli.State == true) 
                                  && HERE I WANT THE ESPECIALIDAD.ID == ID BUT I DON'T KNOW HOW)
                                  select cli).ToList();

Пожалуйста, любые предложения , Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Таким образом, каждый Clini c имеет ноль или более докторов, а каждый врач работает в нуле или более клиник. Очевидно, вы используете платформу, которая реализует это отношение «многие ко многим», используя virtual ICollection, как это делает Entity Framework.

class Clinic
{
    public int Id {get; set;}  // primary key
    ...                        // other properties

    // every Clinic has zero or more Doctors (many to many):
    public virtual ICollection<Doctor> Doctors {get; set;}
}

Аналогично, существует связь между многими врачами и специальностями:

class Doctor
{
    public int Id {get; set;}  // primary key
    ...                        // other properties

    // every Doctor works in zero or more Clinics (many-to-many):
    public virtual ICollection<Clinic> Clinics {get; set;}

    // every Doctor has zero or more Specialties
    public virtual ICollection<Specialty> Specialties {get; set;}
}

Для полноты информации Специальность:

class Specialty
{
    public int Id {get; set;}  // primary key
    public string Description {get; set;}
    ...                        // other properties

    // every Specialty belongs to zero or more Doctors (many to many):
    public virtual ICollection<Doctor> Doctors {get; set;}
}

Я хочу сделать запрос linq, чтобы найти все клиники, в которых есть врачи со специализацией c.

int specialtyId = ...
var clinicsWithSpecialty = myDbContext.Clinics

    // keep only those Clinics that have at least one Doctor with the desired specialty
    .Where(clinic => clinic.Doctors
        .Where(doctor => doctor.Specialties.Select(specialty => specialty.Id == specialtyId)
        .Any())
    .Select(clinic => new
    {
        // Select the clinic properties you want:
        Id = clinic.Id,
        Name = clinic.Name,
        ...

        // Select the Doctors you want:
        Doctors = clinic.Doctorw.Where(doctor => ...)
            .Select(doctor => new
            {
                // Select the Doctor properties that you want
                Id = doctor.Id,
                ...

                Specialties = doctor.Specialties
                    .Where(specialty => ...)
                    .Select(specialty => new
                    {
                        // Select the specialties that you want
                        ...
                    })
                    .ToList(),
             })
             .ToList(),
     });

По соображениям эффективности не выбирайте какие-либо свойства, которые вы не планируете использовать, особенно внешние ключи для ваших соединительных таблиц. Если Clini c [10] имеет 300 Докторов, то у каждого Доктора будет одинаковое значение для внешнего ключа к соединительной таблице. Передача этого значения будет 300 раз, если вы его не используете.

При извлечении данных используйте параметр «Включить» только в том случае, если вы планируете изменить извлеченные данные. Если вам нужно только запросить его, используйте Select.

0 голосов
/ 30 марта 2020

Ваш вопрос не очень понятен, но я думаю, что вы ищете что-то вроде:

var clinicList = await clinica.Clinic.Where(x => x.DoctorSpecialty.Any(s => s.Id == specialtyId)).ToListAsync();

ОБНОВЛЕНИЕ

Следовательно, ваш вопрос не не очень ясно ". В общем случае со многими ко многим, особенно если вы используете EF Core, вы должны настроить следующее:

public class Doctor
{
    ...
    public ICollection<DoctorSpecialty> Specialties { get; set; }
}

public class Specialty
{
    ...
    public ICollection<DoctorSpecialty> Doctors { get; set; }
}

public class DoctorSpecialty
{
    public int DoctorId { get; set; }
    public int SpecialtyId { get; set; }
}

Тогда Clinic будет выглядеть примерно так:

public ICollection<Doctor> Doctors { get; set; }

Предполагая такую ​​настройку, вы бы запросили:

context.Clinics.Where(x => x.Doctors.Any(d => d.Specialties.Any(s => s.SpecialtyId == specialtyId)))
...