簡體   English   中英

.NET存儲庫模式通用查詢方法

[英].NET Repository pattern generic Query Methodology

我正在使用存儲庫模式,並且有一個基本存儲庫,並且使用了Entity Framework和Web api; 我的問題是我想讓我的客戶能夠動態查詢任何數據; 諸如Dynamics CRM中使用的查詢表達式和提取xml之類的東西; 我嘗試了規范模式,但是這還不夠,因為我想允許客戶端代碼對具有不同列的數據進行排序,例如Name asc Address desc,並且允許對返回結果進行分頁;所以我的方法要求是

  1. 不依賴ORM技術的通用過濾器,因為我將來可能會更改實體框架
  2. 通用排序方法; 允許多個排序列,例如Name asc Address desc
  3. 客戶端將返回的列或所有列(例如columnSet)確定為“地址,名稱和ID”或返回整個記錄
  4. 允許分頁,例如頁面索引和頁面大小
  5. 返回的記錄數的支持閾值,因為較大的結果可能會影響性能

這是我最初的方法,但我不知道它是否更好

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM