С точки зрения получения Application
в качестве конечного результата, один вариант будет
Включите все - Не слишком здорово:
это выглядело бы как
var x = await Table.Include(a=> a.ApplicationDisciplines).ThenInclude(a=> a.Discipline).ThenInclude(a=> a.DisciplineTranslations).ThenInclude(a=> a.Language).Where( a=> a.Name == appName && a.Any(b=> b.Discipline.DisciplineTranslations.Any(c=> c.Language.Key == languageKey))).FirstOrDefaultAsync()
Я не проверял это, хотя цепочка с помощью операции .Any()
должна работать. Я знаю, что вы можете зацепить его двумя уровнями глубины, но без проверки, пройдя дополнительные пункты.
Я бы сказал, что это плохой подход, поскольку в целом он может привести к довольно медленному запросу.
Использование соединения: Возможно, лучшее решение в целом
var aThing = ApplicationDisciplineTable.Include(x=> x.Application).Include(x=> x.Discipline).Where(x=> x.Application.Name == appName).ToList().Join(DisciplineTranslationTable.Include(x=> x.Language).Where(x=> x.Language.Key == appKey), AppDis => AppDis.DisciplineId, DisTrans => DisTrans.DisciplineId, (AppDis, DisTrans) => new {whatever details you want in here}).FirstOrDefault();
Итак, соединение не выглядит супер чистым, вы МОЖЕТЕ выбрать только приложение в конце с точными деталями, которые вы хотите в нем, так как у вас есть все, что вам нужно. Но это использование соединения непосредственно на промежуточных объектах, которые были отфильтрованы, поэтому в итоге получится только одна дисциплина, приложение и язык, которые соответствуют критериям