Linq to Entities,选择带有子实体的父实体,其中子实体匹配条件

时间:2018-11-10 01:19:44

标签: vb.net entity-framework linq-to-entities

这似乎应该是一件简单的事情,但是我似乎找不到能满足我需要的示例。

我有实体“ 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,我可以看到它正在使用左外部联接,我认为这不是必需的。

因此,我基本上需要的是一个“人”实体列表,以及一个“保存的搜索”实体列表,其中“ SendEmail”为真。

我也应该补充。如果它们包含匹配的“ SavedSearch”子实体,我只想要“人”实体。

1 个答案:

答案 0 :(得分:1)

您使用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")