[英].NET Repository pattern generic Query Methodology
我正在使用存儲庫模式,並且有一個基本存儲庫,並且使用了Entity Framework和Web api; 我的問題是我想讓我的客戶能夠動態查詢任何數據; 諸如Dynamics CRM中使用的查詢表達式和提取xml之類的東西; 我嘗試了規范模式,但是這還不夠,因為我想允許客戶端代碼對具有不同列的數據進行排序,例如Name asc Address desc,並且允許對返回結果進行分頁;所以我的方法要求是
這是我最初的方法,但我不知道它是否更好
IList<TEntity> AllMatching(ISpecification<TEntity> specification = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
IList<Expression<Func<TEntity, object>>> includes = null,
int? pageIndex = null, int? pageCount = null);
您可以開始執行此操作:
public IQueryable<TEntity> Select(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
IList<Expression<Func<TEntity, object>>> includes = null,
int? page = null,
int? pageSize = null)
{
IQueryable<TEntity> query = _dbSet;
if (includes != null)
{
query = includes.Aggregate(query, (current, include) => current.Include(include));
}
if (orderBy != null)
{
query = orderBy(query);
}
if (filter != null)
{
query = query.AsExpandable().Where(filter);
}
if (page != null && pageSize != null)
{
query = query.Skip((page.Value - 1)*pageSize.Value).Take(pageSize.Value);
}
return query;
}
如您所見,它幾乎可以滿足您的所有需求,因此,如果要在Repository
實現中執行相同的操作,則必須使用LinqKit nuget包。
如果要選擇特定的列,則可以創建另一個方法,如下所示:
IEnumerable<TResult> AllMatching<TResult>(
Expression<Func<TEntity, TResult>> columns,
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
IList<Expression<Func<TEntity, object>>> includes = null,
int? pageIndex = null,
int? pageCount = null)
{
var query=Select(filter,orderby,includes,page,pageSize);
return query.Select(columns);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.