这似乎应该是一件简单的事情,但是我似乎找不到能满足我需要的示例。
我有实体“ 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”子实体,我只想要“人”实体。
答案 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")