【发布时间】:2018-11-10 01:19:43
【问题描述】:
这似乎应该是一件简单的事情,但我似乎无法找到一个可以满足我需要的示例。
我有实体“Person”和“SavedSearch”。这些与外键正确连接,因此导航属性有效。一个“Person”可以包含多个“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”为真。
我也应该补充。我只想要包含匹配的“SavedSearch”子实体的“Person”实体。
【问题讨论】:
-
你真的应该对集合使用复数名称,而只对返回单个实体的属性使用单数名称。
db.Person应该是db.People或db.Persons和p.SavedSearch应该是p.SavedSearches。类型、成员和变量名称应尽可能自记录,因此应始终使用复数名称来表示数组或集合。 -
谢谢@jmcilhinney 在这种情况下,我只是让 VS 使用默认设置从现有数据库创建模型,这就是它想出的。不过,我会在以后的项目中记住这一点。
-
复数集合名称是使用数据库优先时的选项之一。在这种情况下,您应该检查所有可用的选项。您仍然可以重新运行向导并让它进行更改,您还可以在设计器中更改实体或属性名称。
标签: vb.net entity-framework linq-to-entities