关于过滤和排序的简单存储库问题

时间:2010-01-05 17:44:56

标签: c# filter sorting ddd-repositories

我有一个来自存储库的产品列表。很简单。现在我想添加过滤和排序。排序可能发生在存储库之外,因为在存储库中没有效率增益(猜测)。我无法想象在存储库之外进行过滤,因为我们只想加载我们关心的记录。我认为你会想要创建一个过滤器委托并将其传递给存储库。

以下代码是伪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是一个普通的电子商务产品;)Rob Conery的Ajax笔记是here

感谢。

1 个答案:

答案 0 :(得分: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(以及许多商业选项)可以提供有关如何提供线索的线索你可以更好地设计这个以实现可用性。