EntityFramework Eager加载所有导航属性

我正在使用DI和IoC的Repository模式。

我在我的存储库中创建了一个函数:

T EagerGetById(Guid id, string include) where T : class { return _dbContext.Set().Include(include).Find(id); } 

这将急切地在我的实体中加载一个导航属性。

但如果我的实体看起来像这样:

 public class Blog : PrimaryKey { public Author Author {get;set;} public ICollection Posts {get;set;} } 

我如何获得AuthorPosts热切加载? 我真的必须这样做:

 _dbContext.Set().Include("Author").Include("Posts").Find(id); 

不可避免地产生这样的function:

 T EagerGetById(Guid id, string include, string include2, string include3) where T : class { return _dbContext.Set().Include(include).Include(include2).Include(include3).Find(id); } 

因为对于Generic存储库而言,这将是非常低效的!

如果您不想使用字符串,则还可以通过使用返回要急切加载的导航属性的表达式对任何N个包含执行相同操作。 (原始来源)

 public IQueryable GetAllIncluding(params Expression>[] includeProperties) { IQueryable queryable = GetAll();   foreach (Expression> includeProperty in includeProperties) {   queryable = queryable.Include(includeProperty);   } return queryable; } 

如果您需要所有导航属性,则别无选择,只能从数据库中读取所有这些属性。 您可以在查询中Include它们,也可以事先将它们读取到DbSet的本地数据中。

如果要将多个包含传递给方法,只需将其定义如下:

 T EagerGetById(Guid id, params string[] includes) 

您的用户将能够调用EagerGetById(id, "inc1", "inc2", ...)

在您的方法中,只需为includes数组中的每个元素调用Include

你应该准备好关于params关键字