2010-01-05 3 views
2

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

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

Спасибо.

ответ

4

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

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

+0

Итак, вы говорите, что ORM должна обеспечивать сортировку и фильтрацию для ваших классов POCO, например, если вы используете шаблоны итератора и т. Д.? –

+0

В идеале, да. Вы хотите, чтобы ORM и уровень данных обрабатывали сортировку и фильтрацию, потому что БД должна работать с этим. Используя IQueryable , фактический фильтр + сортировка отображается непосредственно в БД. –

+0

Например, Linq to Sql поддерживает .Where. Поэтому я бы использовал dc.Products.where (x => x.Name.contains («Hammer»)) и продолжать добавлять.если бы у меня были дополнительные фильтры. Поэтому я должен построить в моем репозитории большой оператор foreach, чтобы принять список условий, а затем применить их как методы .where()? Что касается сортировки, я бы сделал то же самое, например .OrderBy (x => x.Name)? Построить этих делегатов в моем контроллере, а затем передать их как параметры в методе репозитория? –

Смежные вопросы