EF发送通过参数包含到存储库的列表



i此刻,我的存储库填充了多个获取方法。

E.Q。Get1() => cxt.Entites.Include(e => e.obj1); Get2() => cxt.Entities.Include(e => e.obj1).Include(e => e.obj2)

等等。

有很好的方法,模式可以使用一种获得我可以通过参数发送包含的方法?

public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;
        if (filter != null)
        {
            query = query.Where(filter);
        }
        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }
        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

请参阅MSDN中的存储库模式您可以使用

_sampleRepostiory.Get(h=>h.Id>1,null,"Employees.Departments");

与lambda相同

public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            Expression<Func<TEntity, object>>[] includes)
        {
            IQueryable<TEntity> query = dbSet;
            if (filter != null)
            {
                query = query.Where(filter);
            }
             if (includes != null)
           {
              query = includes.Aggregate(query, 
                  (current, include) => current.Include(include));
            }
            if (orderBy != null)
            {
                return orderBy(query).ToList();
            }
            else
            {
                return query.ToList();
            }
        }

像这样的消费

var query = context.Customers
               .Get(x=>x.Id>1,null,
                   c => c.Address,
                   c => c.Orders.Select(o => o.OrderItems));

类似的问题

我在项目中做了以下内容:

public Entity[] GetAll(bool includeObj1, bool includeAllOthers) {
    IQueryable<Entity> entity = ctx.Entities;
    if (includeObj1) 
        entity = entity.Include(e => e.obj1);
    if (includeAllOthers) {
        entity = entity
            .Include(e => e.obj2)
            .Include(e => e.obj3)
            .Include(e => e.obj4)
            .Include(e => e.obj5);
    }
    return entity.ToArray();
}

提供诸如includeObj1includeObj2之类的参数将存储库的消费者与实现分开,并封装任何数据访问逻辑。
将直接的"包括这些属性"订单传递给存储库意味着您知道存储库的工作原理,并假设是某种模糊抽象的ORM。

最新更新