Простой репозиторий Вопрос о фильтрации и сортировке - PullRequest
2 голосов
/ 05 января 2010

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

Приведенный ниже код является псевдо-кодом 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 представляет собой простой старый продукт для электронной коммерции;) Примечания Аякса Роба Конери: здесь

Спасибо.

1 Ответ

4 голосов
/ 05 января 2010

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

Интерфейс 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, - существует довольно много вариантов с открытым исходным кодом, таких как Subsonic (а также множество коммерческих вариантов), которые могут предоставить как вы можете лучше спроектировать это для удобства использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...