我们正在使用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");
答案 0 :(得分:1)
请注意,目前无法过滤加载了哪些相关实体。包含将始终引入所有相关实体。 Msdn Reference
在此存储库模式中,您无法使用此指定方法执行此操作。
您可以扩展您的存储库以返回IQuerable并执行相同操作。
public virtual IQueryable<TEntity> GetAsQueryable(Expression<Func<TEntity, bool>> where)
{
return _dataContext.TEntity.Where(where).AsQueryable();
}
请求此功能here
为了过滤子集合,您需要与此类似的内容。
var anonymousProjection = dbContext.CustomerEntity
.Where(c => ! c.IsDeleted)
.Select(x=> new
{
customers = x,
orders = x.Orders.Where(h=>h.IsDeleted)
}).ToList();