我们如何在通用存储库模式中应用条件包含使用 includeProperties?
How can we apply conditional include using includeProperties in generaic repository pattern?
我们正在使用 Entity framework 以及通用存储库模式。
加载多个实体时,我们在通用存储库模式中使用 includeProperties 字符串过滤器。
以下是我服务中的代码 class、
customerRepository.Get (filter: c => ! c.IsDeleted, includeProperties : "Orders");
以下是我的通用存储库中的代码
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 我们只能加载一个客户的所有订单。
我们如何才能只加载客户未删除的订单?
即我们如何在通用存储库模式中使用 includeProperties 应用条件包含?
我们尝试了下面的代码,但没有成功:
customerRepository.Get (filter: c => ! c.IsDeleted && ! c.Orders.IsDeleted, includeProperties : "Orders");
Note that it is not currently possible to filter which related entities are loaded. Include will always bring in all related entities.
Msdn Reference
在此存储库模式中,您无法使用此指定方法执行此操作。
您可以将存储库扩展到 return 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();
我们正在使用 Entity framework 以及通用存储库模式。
加载多个实体时,我们在通用存储库模式中使用 includeProperties 字符串过滤器。
以下是我服务中的代码 class、
customerRepository.Get (filter: c => ! c.IsDeleted, includeProperties : "Orders");
以下是我的通用存储库中的代码
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 我们只能加载一个客户的所有订单。
我们如何才能只加载客户未删除的订单?
即我们如何在通用存储库模式中使用 includeProperties 应用条件包含?
我们尝试了下面的代码,但没有成功:
customerRepository.Get (filter: c => ! c.IsDeleted && ! c.Orders.IsDeleted, includeProperties : "Orders");
Note that it is not currently possible to filter which related entities are loaded. Include will always bring in all related entities. Msdn Reference
在此存储库模式中,您无法使用此指定方法执行此操作。
您可以将存储库扩展到 return 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();