Простой вопрос репозитория о фильтрации и сортировке

StackOverflow https://stackoverflow.com/questions/2007955

Вопрос

У меня есть список продуктов, поступающих из репозитория.Достаточно просто.Теперь я хочу добавить фильтрацию и сортировку.Сортировка может происходить за пределами репозитория, поскольку при ее выполнении внутри репозитория нет повышения эффективности (предполагаю).Я не мог представить, что буду выполнять фильтрацию вне репозитория, поскольку мы хотим загружать только те записи, которые нам небезразличны.Я бы подумал, что вы хотели бы создать делегат фильтра и передать его в репозиторий.

Приведенный ниже код является псевдокодом C #.Как бы выглядел функционирующий код для сортировки / фильтрации?

Приведенный ниже процесс на самом деле сосредоточен вокруг передачи делегатов в репозиторий для фильтрации:

Product myProduct = Repo.GetProducts( filter );

(если бы это был MS MVC, этот код существовал бы в контроллере):

Настройка фильтра:

//TODO: Need filter class definition
var filter = new Filter(); // made up object class for now
filter.AddCondition( field, operator, value);  // do this for each filter condition
filter.AddCondition( Product.Name, contains, "Hammer"); // Product.Name ?? (Example)

Product myProducts = Repo.GetProducts( filter ); // the Product call **FILTER**

Настройка сортировки:

// TODO: Need sort class definition
var sort = new Sort(); // another made up object class for now
sort.AddOrder( field, priority, sequenceUp) // Sequence enum is ascending/descending
sort.AddOrder( Product.Name, 1, ascending) // (Example) **SORT**

myProducts.AddSort(sort);

Возвращает модель представления:

// Next part strips off unnecessary fields for view (Presentation model)
// So we are not sending a huge data model to the view (hopefully good)
// TODO: Replace string with Service? function to extract a miniProduct from Product

MiniProduct myMinis = MakeMiniProductsFrom( myProducts);  // Service?

// Determine response type (XML, JSON, HTML View) and return appropriate data
// use "x-requested-by" as per Rob Conery noted below
if (Request.IsAjaxRequest()) return Json(myMinis);
else return View(myMinis);

Как вы можете видеть, этот код нуждается в некоторой помощи.Я действительно ищу код класса сортировки и фильтрации, который мог бы заставить это работать, или ссылки на внешние источники.Я предполагаю, что сортировка и фильтрация являются стандартной практикой в рамках DDD и шаблонов проектирования, отсюда и вопрос.Предположим, что Product - это обычный старый продукт электронной коммерции ;) Примечания Роба Конери к Ajax таковы здесь

Спасибо.

Это было полезно?

Решение

В идеале, вы, вероятно, захотите выполнить сортировку и фильтрацию внутри репозитория.Это особенно важно, если вы загружаете большие коллекции, поскольку база данных, скорее всего, сможет выполнять сортировку более эффективно, чем это можете сделать вы, и возвращать отсортированные результаты напрямую.

Тот Самый IQueryable<T> интерфейс предназначен для простой обработки этого - он является основой для Entity Framework, LINQ to SQL и других баз данных с поставщиком LINQ.Хорошая вещь в попытке поддержать (по крайней мере, на каком-то уровне) IQueryable<T> это позволяет вам использовать ваш репозиторий очень стандартным способом.Например, ваш псевдокод, использующий IQueryable<T>, могло бы выглядеть больше как:

IList<Product> myProducts = Repo.Products.Where( p => p.Category == theCategoryToFind ).OrderBy( p => p.Name );

Или, по желанию, просто:

var products = from p in Repo.Products
               where p.Category == theCategory
               order by p.Name
               select p;

Я рекомендую посмотреть, как работают некоторые технологии доступа к данным, ориентированные на LINQ - существует довольно много вариантов с открытым исходным кодом, таких как Дозвуковой (а также множество коммерческих опций), которые могут дать подсказки относительно того, как вы можете лучше спроектировать это для удобства использования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top