我们如何应用条件包括在generaic存储库模式中使用includeProperties?

时间:2016-03-28 09:54:21

标签: c# asp.net-mvc entity-framework-6 repository-pattern

我们正在使用Entity框架以及通用存储库模式。

当加载多个实体时,我们在通用存储库模式中使用includeProperties字符串过滤器。

以下是我服务类中的代码

customerRepository.Get (filter: c => ! c.IsDeleted, includeProperties : "Orders");

以下是我的Generic Repository中的代码

 public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "",
            Func<TEntity, TEntity> selectColumns = null)
{
    IQueryable<TEntity> query = dbSet;

    if (filter != null)
    {
        query = query.Where(filter);
    }

    if (selectColumns != null)
    {
        query = query.Select(selectColumns).AsQueryable();
    }

    query = includeProperties.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Aggregate(query, (current, includeProperty) => current.Include(includeProperty));

    return orderBy != null ? orderBy(query).ToList() : query.ToList();
}

客户可能有多个已删除的订单。但是,如果使用上述includeProperties,我们只能加载客户的所有订单。

我们如何只加载客户的未删除订单?

即。我们如何在generaic存储库模式中应用includeProperties?

我们尝试了下面的代码,但它不起作用:

customerRepository.Get (filter: c => ! c.IsDeleted && ! c.Orders.IsDeleted, includeProperties : "Orders");

1 个答案:

答案 0 :(得分:1)

  

请注意,目前无法过滤加载了哪些相关实体。包含将始终引入所有相关实体。   Msdn Reference

在此存储库模式中,您无法使用此指定方法执行此操作。

您可以扩展您的存储库以返回IQuerable并执行相同操作。

public virtual IQueryable<TEntity> GetAsQueryable(Expression<Func<TEntity, bool>> where)
{
    return _dataContext.TEntity.Where(where).AsQueryable();
}

See reference

请求此功能here

为了过滤子集合,您需要与此类似的内容。

var anonymousProjection = dbContext.CustomerEntity
                                 .Where(c => ! c.IsDeleted)
                                 .Select(x=> new 
                                  {
                                       customers = x,
                                       orders = x.Orders.Where(h=>h.IsDeleted)
                                  }).ToList();

Similar answer