我正在迁移到 EF6,希望能够充分利用
Include
急切加载功能。然而,在运行一些测试后,似乎无法将实体的虚拟集合与 Include
函数一起使用。
考虑以下定义:
class Group
{
public virtual ICollection<Member> Members {get;set;}
}
class Member
{
public int ID {get;set;}
public virtual User User {get;set;}
}
我很困惑为什么在使用
Include
时无法调用虚拟集合属性,因为急切地加载这样的附加数据很有意义:
group.Members.Include(m => m.User);
而不是做这样烦人的事情:
using (var db = Context())
{
var memberIds = group.Members.Select(m => m.ID);
db.Members.Include(m => m.User).Where(m => memberIds.Includes(m.ID));
}
如果我们不能在新的高效查询中使用这些虚拟集合快捷方式,那么它们还有什么意义呢?请注意,我尝试添加
.AsQueryable()
,这不会导致任何连接,而只是像往常一样延迟加载。
当你有两个模型并且模型之间存在关系时。像这样:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Member
{
public int Id { get; set; }
public int UserId { get; set; }
public User User { get; set; }
}
如果您加载成员而不包含成员。用户为空
如果您使用包含具有此条件的用户
User.Id == Member.UserId
加载并在member.User中设置
var member = dbContext.Members.Include(m => m.User).First();
当您使用 include 时,EF 会生成 sql 查询:
select top 1 m.*, u.*
from Members m
join users u on u.Id = m.UserId