实体框架通用存储库,包括通过参数的属性 [英] Entity Framework Generic repository including properties through parameter
本文介绍了实体框架通用存储库,包括通过参数的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在实体框架中有一个通用存储库的实现,我正在尝试改进它以使用 EF 提供的 .Include(..) 函数,而不是按字符串包含导航属性,以便能够安全地重命名属性.
I have an implementation of a Generic Repository in Entity Framework which I am trying to improve to use the .Include(..) function provided by EF instead of including the navigation properties by string, in order to be able to safely rename properties.
以下是我当前的代码:
public IQueryable<T> GetAll(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "")
{
IQueryable<T> 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);
}
else
{
return query;
}
}
我目前以下列方式使用它:
I currently use this in the following way:
repository.GetAll(
u => u.Name = "John",
u => u.OrderBy(x => x.Name),
"Address.State",
);
我的问题是:如何更改方法以便能够以以下方式(或类似方式)调用它:
My question is: how can I change the method in order to be able to call it in the following way (or similar):
repository.GetAll(
u => u.Name = "John",
u => u.OrderBy(x => x.Name),
u => u.Include(x => x.Address).ThenInclude(x => x.State),
);
推荐答案
protected internal IQueryable<TEntity> Filter(Expression<Func<TEntity, bool>> predicate, params Expression<Func<TEntity, object>>[] includeProperties)
{
var query = RetrieveQuery();
if (predicate != null)
{
query = query.Where(predicate).AsQueryable();
}
if (includeProperties != null)
{
query = _queryableUnitOfWork.ApplyIncludesOnQuery(query, includeProperties);
}
return (query);
}
这个方法在那里调用
public IQueryable<TEntity> ApplyIncludesOnQuery<TEntity>(IQueryable<TEntity> query, params Expression<Func<TEntity, object>>[] includeProperties) where TEntity : class, IEntity
{
// Return Applied Includes query
return (includeProperties.Aggregate(query, (current, include) => current.Include(include)));
}
过滤方法调用
public IEnumerable<ShowStockProductDto> GetActiveShowStockProductListByProduct(int productId)
{
var foundedPStockroducts = Filter(
ent => ent.ProductId == productId && ent.IsActive,
ent => ent.StockProductPrices,
ent => ent.StockProductDepots,
ent => ent.StockProductSpecificationValues,
ent => ent.StockProductSpecificationValues.Select(spsv => spsv.SpecificationValue)
);
// Map foundedPStockroducts to showStockProductList
var showStockProductList = TypeAdapterFactory.Adapter.Adapt<IEnumerable<ShowStockProductDto>>(foundedPStockroducts).ToList();
return (showStockProductList);
}
这篇关于实体框架通用存储库,包括通过参数的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文