1

Я использую шаблон репозитория, и у меня есть базовый репозиторий, и я использую Entity Framework и web api; Мой вопрос: я хочу, чтобы мои клиенты могли запросить любые данные динамически; что-то вроде выражений запросов и выборки xml, используемых в Dynamics CRM; Я пробовал шаблон спецификации, но этого недостаточно, так как я хочу, чтобы клиентский код заказывал данные с разными столбцами, например. Имя ASC Адрес DESC, а также позволяет пагинацию на возвращенном результате, поэтому мои требования метода.NET Repository pattern generic Методология запросов

  1. общего фильтр, который не зависит от ОРМ технологии, как я могу изменить Entity Framework в будущем
  2. Generic Сортировки методология; разрешить несколько столбцов сортировки, например. Название asc Адрес desc
  3. Клиент определяет возвращенные столбцы или все столбцы, например. columnНаписать «Адрес, имя и идентификатор» или вернуть всю запись
  4. Разрешить разбиение на страницы, например. Страница Индекс и размер страницы
  5. порог
  6. Поддержка по количеству возвращенных записей, как большой результат может повлиять на производительность

это мой первоначальный метод, но я не знаю, если это лучше или нет

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); 

ответ

2

вы можете начать делать это:

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, вы должны использовать пакет nuget LinqKit.

Если вы хотите выбрать определенные столбцы, вы можете создать еще один метод, как я покажу ниже:

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); 

} 
+0

спасибо за вашу помощь; я попробую их, но я хочу, чтобы эти запросы выполнялись в базе данных, а не в памяти; но поддерживает ли это решение общую методологию сортировки с несколькими столбцами; пожалуйста, дайте мне пример применения этого решения, а также как применить порог к возвращаемым данным. Как управлять максимальным количеством возвращенных строк – yo2011

+0

также требуется использование LinqKit – yo2011

+0

Спасибо, что он отлично работает без AsExpandable(); я не знаю его благосклонности; также, я хочу знать, как установить порог для возвращаемых строк; все большие приложения, такие как SharePoint, устанавливают пороговое значение для выполняемого запроса для проблем с производительностью. – yo2011