想象我们有以下数据库结构
Organization
{
Guid OrganizationId
//....
}
User
{
Guid UserId
}
OrganizationUsers
{
Guid OrganizationId
Guid UserId
}
当edmx生成此类时,它将OrganizationUsers
抽象化为多对多引用。因此将不会为其生成POCO类。
说我正在从上下文中加载数据,但是为了避免笛卡尔生产,我不使用包含项,而是进行两个单独的查询。
using(var context = new EntitiesContext())
{
var organizationsQuery = context.Where(FilterByParent);
var organizations = organizationsQuery.ToList();
var users = organizationsQuery.SelectMany(x => x.Users).Load();
}
假设连接的实体已加载是安全的吗?如果我直接从DBSet加载用户,这会有所不同吗?
假定连接的实体已加载是否安全?
是的,很安全,因为首先由organizations
跟踪EF Change Tracker
,然后在下一条语句中调用Load
,EF知道结果应该附加到跟踪的实体上
如果我直接从DBSet加载用户,这会有什么区别吗?
实际上以这种方式使用Load
并没有比Include
更好!
[如果您使用Include
EF将其转换为LEFT JOIN
,如果您使用Load
它将被转换为INNER JOIN
,并且如果您使用Contains
方法通过用户的ID直接获取用户,它将被转换为IN
在Sql端。在Load
和Contains
情况下,您在Sql上执行了两个查询(两次通过),但是在Include
情况下,它一次执行了,因此总体而言,它的性能优于您的方法。
您可以使用Sql Profiler
工具自己比较这些方法。