多种包括使用实体框架和存储库模式

问题描述 投票:0回答:2

我使用实体框架和存储库模式进行所有数据访问,在使用表导航时,我注意到当我获取第一个对象并引用导航对象中的字段时,正在运行 2 个查询。由于我在数据库中有很多关系,因此使用这种技术进行导航属性可能会导致性能开销。

我研究了

Include(string tableName)
方法,这会非常有效(如果我没有使用通用 RP),但这只需要一个表名。我已经通过将位置从
classs
更改为
EntityObject
,成功在我的存储库模式中复制了这一点,但如何使用存储库模式在一个查询中包含多个包含??

这是我的代码:

public class GenericRepository<T> : IRepository<T> where T : EntityObject, new()
{
    private Entities _Context;
    private ObjectSet<T> _ObjectSet;

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, string include)
    {
        // This works OK
        return this._ObjectSet.Include(include).Where(predicate);
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
    {
        // This will not work but is what I am trying to do
        return this._ObjectSet.Include(include).Where(predicate);
    }
}
c# entity-framework generics repository-pattern
2个回答
9
投票

您可以链接您的包含内容:

public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate, param string[] include)
{
    IQueryable<T> query = this._ObjectSet;
    foreach(string inc in include)
    {
       query = query.Include(inc);
    }

    return query.Where(predicate);
}

0
投票

我多年来只使用存储库。在类型化的继承存储库中,您将获得类型化的智能感知,因此您的包含内容是 lambda 表达式的数组。唯一的问题是一对多,其中包含的对象也包含对象。将这些子对象包含在对象数组中的唯一方法是使用 DbContext .include -> .thenInclude。

public abstract class Repo<T> : IRepo<T> where T : class

public async Task<T> FindAsync( Expression<Func<T, bool>> match, params Expression<Func<T, object>>[] includes )
{
    IQueryable<T> r = _context.Set<T>().Where( match );
    r = includes.Aggregate( r, ( current, include ) => current.Include( include ) );
    return await r.SingleOrDefaultAsync( match );
}
© www.soinside.com 2019 - 2024. All rights reserved.