Entity Framework:如何预加载虚拟集合的关联记录?
EF6中通过虚拟集合导航属性实现预加载的优化方案
迁移至EF6后,我希望通过预加载遍历实体的虚拟集合关联记录以保证最优查询效率,但尝试对虚拟集合使用Include预加载函数时并未生效——访问这些虚拟集合仍会触发懒加载生成数据库查询,我认为应该有办法控制这类查询。
实体定义
class Group { public virtual ICollection<Member> Members {get;set;} } class Member { public int ID {get;set;} public virtual User User {get;set;} } class User { public int ID {get;set;} ... }
当前问题与尝试
我需要查询某一小组的所有成员及其关联的User,避免逐个查询用户的低效懒加载。尝试直接对虚拟ICollection使用Include:
var members = group.Members.Include(m => m.User);
虽然能获取数据,但访问User时仍会触发懒加载。这是因为Include仅对IQueryable对象生效,对ICollection调用AsQueryable也无法解决问题,目前只能重新构建查询:
using (var db = Context()) { var memberIds = group.Members.Select(m => m.ID); db.Members.Include(m => m.User).Where(m => memberIds.Contains(m.ID)); }
这种方式仅需2次查询,而懒加载需要1+N次,但我希望直接使用内置集合和导航属性实现预加载。请问是否有更简便的方法?比如自定义ICollection扩展来实现?
内容的提问来源于stack exchange,提问作者jpro
相关产品推荐
相关产品推荐

