Предположим, у вас есть 3 родителя с идентификатором 10, 11, 12. Предположим, у вас есть 3 ребенка с идентификатором 20, 21, 22 * 1001 *
Таблица ParentChildrens:
ChildId | ParentId
20 10
20 11
20 12
21 10
21 11
22 10
22 12
Таким образом, ребенок 20 имеетРодители 10/11/12;Ребенок 21 имеет Родителя 10/11;У ребенка 22 есть родители 10/12.
«Сделайте детей общими для всех родителей»;Если это означает: получить детей, у которых есть каждый доступный Родитель в его коллекции Родителей, тогда легко увидеть, что вам нужен только Ребенок 20, и вы хотите этого Ребенка только один раз
Потому что все Родители- Отношения с детьми уникальны, мы знаем, что если есть X родителей, мы хотим, чтобы у детей было ровно X родителей.
Вам не нужны все свойства этих детей, вы хотите только" получить свое имя от ChildrenLocalization with Language =" en", всегда ли такое имя равно нулю или одному? Если есть еще, какое из них мы должны взять? Любое имя или все имена?
Поскольку нам нужно ограничить себя всеми детьми, у которых ParentCount равен числу родителей, нам также необходимо рассчитать число родителей на ребенка
var childrenWithParentCount = dbContext.Children.Select(child => new
{
// "get its name from ChildrenLocalization with Language="en"
LocalizationName = child.ChildrenLocalizations
.Where(localization => localization.Language == "en")
.Select(localization => localizaition.Name)
.FirstOrDefault();
// or if you want all names:
LocalizationNames = child.ChildrenLocalizations
.Where(localization => localization.Language == "en")
.Select(localization => localizaition.Name)
.ToList;
ParentCount = child.ParentChildren
.Select(parentChild => parentChild.ParentId)
.Count();
});
Теперь нам не нужны все этидети, мы хотим, чтобы только те дети, у которых ParentCount равен числу родителей
var childrenWithAllParents = childrenWithParentCount
.Where(child => !child.ParentCount == dbContext.Parents.Count());
Вы заметили, что я создал только объекты IQueryable, яеще не выполнил ни одного из запросов.Чтобы выполнить запрос:
var result = childrenWithAllParents.ToList();
Некоторые люди любят удивлять других одним большим оператором LINQ;что ж, вот оно:
var result = dbContext.Children.Select(child => new
{
LocalizationName = child.ChildrenLocalizations
.Where(localization => localization.Language == "en")
.Select(localization => localizaition.Name)
.FirstOrDefault();
ParentCount = child.ParentChildren
.Select(parentChild => parentChild.ParentId)
.Count();
})
.Where(child => !child.ParentCount == dbContext.Parents.Count())
.ToList();
К счастью, ваша система управления базами данных достаточно умна, чтобы запоминать количество родителей, вместо того, чтобы снова рассчитывать ее один раз на ребенка.