实体框架核心,包含导航属性的通用存储库方法

时间:2017-11-04 12:49:08

标签: c# entity-framework c#-4.0 asp.net-core

我想通过业务逻辑项目创建通用数据访问层,业务逻辑层必须与我有一个存储库的DAL层交互。 我希望有一个短期数据上下文和所有存储库方法返回IEnumerable而不是IQueryable。 提示方法GetAll的示例如何通过ThenInclude或Select to dependent tables提取连接的数据。

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class
{
    public virtual IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties)
    {

        List<T> list;
        using (var context = new Context())
        {
            IQueryable<T> dbQuery = context.Set<T>();

            //Apply eager loading
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Include<T, object>(navigationProperty);

            list = dbQuery
                .AsNoTracking()
                .ToList<T>();
        }
        return list;
    }

}

ThenInclude(PROP2 =&GT; prop2.i)?

dbQuery.Include(navigationProperty).ThenInclude(PROP2 =&GT; prop2.i)

1 个答案:

答案 0 :(得分:0)

这实际上是糟糕的设计。你不想这样做。如果要抽象数据访问层,请完全执行此操作。创建一个为您的应用程序提供API的库,它可以准确地返回您所需的API,不多也不少。如果您仍然允许任意查询,那么只需直接利用您的上下文,因为您实际上并没有购买任何其他内容来维护,而没有真正的好处。