Linq to Entities, выберите родительские сущности с дочерними сущностями, где дочерние сущности соответствуют условию - PullRequest
0 голосов
/ 10 ноября 2018

Кажется, это должно быть просто, но я просто не могу найти пример, который делает то, что мне нужно.

У меня есть сущности "Person" и "SavedSearch". Они правильно соединены с внешними ключами, поэтому свойства навигации работают. «Персона» может включать несколько сущностей «SavedSearch».

То, что я хочу сделать, это выбрать список всех сущностей «Person», каждая из которых содержит набор сущностей «SavedSearch», где эти сущности SavedSearch соответствуют определенному условию.

Это самое близкое, что я смог получить ...

Dim person_query = From p In db.Person
                   Where p.SavedSearch.Any(Function(s) s.SendEmails = True)
                   Select New SavedSearchDetails With {
                     .PersonID = p.PersonID,
                     .SavedSearchList = p.SavedSearch.Where(Function(s) s.SendEmails = True)
                   }

Это дает мне правильные результаты, но кажется неправильным указывать условие where дважды. Проверяя сгенерированный SQL, я вижу, что он использует левые внешние объединения, что, по-моему, не нужно.

По сути, мне нужен список сущностей «Person» со списком сущностей «SavedSearch», где «SendEmail» имеет значение true.

Также я должен добавить. Я хочу, чтобы сущности "Person" только включали соответствующие дочерние сущности "SavedSearch".

1 Ответ

0 голосов
/ 10 ноября 2018

Вы используете метод Include для включения дочерних объектов в результат запроса:

Dim peopleWithDavedSearches = From p In db.Person.Include("SavedSearch")
                              Where p.SavedSearch.Any(Function(s) s.SendEmails)
                              Select p

Каждый объект Person в peopleWithDavedSearches будет иметь заполненное свойство SavedSearch, если есть какие-либо объекты для его заполнения.

Вы также можете сделать это:

Dim peopleWithDavedSearches = From p In db.Person.Include(Function(person) person.SavedSearch)
                              Where p.SavedSearch.Any(Function(s) s.SendEmails)
                              Select p

Я не уверен на 100%, предлагает ли стандартная LINQ to Entities такую ​​функциональность в наши дни, или вам все еще нужна дополнительная ссылка, но вы можете попробовать и посмотреть.

Обратите внимание, что если вы хотите включить детей детей, вы просто используете точечную запись, например,

From item In list.Include("Child.GrandChild.GreatGrandChild")

Если вы хотите включить потомков в несколько веток, просто позвоните Include более одного раза, например,

From item In list.Include("Child1").Include("Child2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...