Linq to Entities,select 个具有子实体的父实体,其中子实体匹配条件
Linq to Entities, select parent entities with child entities, where child entities match condtion
这看起来应该是一件简单的事情,但我似乎找不到满足我需要的示例。
我有实体 "Person" 和 "SavedSearch"。它们与外键正确连接,因此导航属性有效。一个 "Person" 可以包含多个 "SavedSearch" 个实体。
我想要做的是 select 所有 "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" 为真。
还有我要补充的。我只想要 "Person" 个实体,前提是它们包含匹配的 "SavedSearch" 个子实体。
您使用 Include
方法在查询结果中包含 child 个实体:
Dim peopleWithDavedSearches = From p In db.Person.Include("SavedSearch")
Where p.SavedSearch.Any(Function(s) s.SendEmails)
Select p
peopleWithDavedSearches
中的每个 Person
object 然后将填充其 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 是否提供该功能,或者您仍然需要额外的参考,但您可以试试看。
请注意,如果你想包含 children of children 那么你只需使用点符号,例如
From item In list.Include("Child.GrandChild.GreatGrandChild")
如果你想在多个分支上包含后代,那么你只需多次调用 Include
,例如
From item In list.Include("Child1").Include("Child2")
这看起来应该是一件简单的事情,但我似乎找不到满足我需要的示例。
我有实体 "Person" 和 "SavedSearch"。它们与外键正确连接,因此导航属性有效。一个 "Person" 可以包含多个 "SavedSearch" 个实体。
我想要做的是 select 所有 "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" 为真。
还有我要补充的。我只想要 "Person" 个实体,前提是它们包含匹配的 "SavedSearch" 个子实体。
您使用 Include
方法在查询结果中包含 child 个实体:
Dim peopleWithDavedSearches = From p In db.Person.Include("SavedSearch")
Where p.SavedSearch.Any(Function(s) s.SendEmails)
Select p
peopleWithDavedSearches
中的每个 Person
object 然后将填充其 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 是否提供该功能,或者您仍然需要额外的参考,但您可以试试看。
请注意,如果你想包含 children of children 那么你只需使用点符号,例如
From item In list.Include("Child.GrandChild.GreatGrandChild")
如果你想在多个分支上包含后代,那么你只需多次调用 Include
,例如
From item In list.Include("Child1").Include("Child2")