Таким образом, каждый 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.