16

我将存储库模式与 DI 和 IoC 一起使用。

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

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

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

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

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

我将如何急切加载Authorand Posts?我真的必须这样做:

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

不可避免地会产生这样的功能:

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

因为这对于Generic存储库来说真的是低效的!

4

2 回答 2

27

如果您不想使用字符串,您也可以使用返回要预先加载的导航属性的表达式对任意 N 个包含执行相同操作。(原始来源在这里

public IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties) 
{
   IQueryable<TEntity> queryable = GetAll();
   foreach (Expression<Func<TEntity, object>> includeProperty in includeProperties) 
   {
      queryable = queryable.Include<TEntity, object>(includeProperty);
   }

   return queryable;
}
于 2013-09-14T18:34:09.113 回答
0

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

如果您想将多个包含传递给您的方法,只需像这样定义它:

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

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

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

你应该准备params关键字

于 2013-09-14T18:18:32.140 回答