2010-01-05 29 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和設計模式中的標準做法,因此是一個問題。假設產品是普通的舊電子商務產品;)Rob Conery的Ajax筆記是here

謝謝。

回答

4

理想情況下,您可能想要在存儲庫中進行排序和過濾。如果您要加載大型集合,這一點尤其重要,因爲數據庫很可能比您能夠更有效地進行排序,並直接返回排序結果。

IQueryable<T>接口旨在處理這種乾淨 - 它是實體框架,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類提供排序和過濾,例如,如果你使用迭代器模式等等。 – 2010-01-05 17:55:36

+0

理想情況下,是的。你希望ORM和數據層處理排序和過濾,因爲數據庫應該處理這個。通過使用IQueryable ,實際的過濾+排序被直接映射到數據庫。 – 2010-01-05 17:56:43

+0

例如,Linq to Sql支持.Where。所以我會使用dc.Products.where(x => x.Name.contains(「Hammer」)),並繼續添加。只要我有額外的過濾器。所以我應該在我的Repository中構造一個大的foreach語句來接受條件列表,然後將它們應用爲.where()方法?至於排序,我會做同樣的,就像.OrderBy(x => x.Name)?在我的控制器中構造這些委託,然後將它們作爲參數存儲在方法中? – 2010-01-05 18:15:46