我有一個來自存儲庫的產品列表。夠簡單。現在我想添加過濾和排序。排序可能發生在存儲庫之外,因爲在存儲庫內部沒有提高效率(猜測)。我無法想象在存儲庫之外進行過濾,因爲我們只想加載我們關心的記錄。我想你會想創建一個過濾器委託並將其傳遞給存儲庫。有關過濾和排序的簡單知識庫問題
下面的代碼是僞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
謝謝。
所以你說ORM應該爲你的POCO類提供排序和過濾,例如,如果你使用迭代器模式等等。 – 2010-01-05 17:55:36
理想情況下,是的。你希望ORM和數據層處理排序和過濾,因爲數據庫應該處理這個。通過使用IQueryable,實際的過濾+排序被直接映射到數據庫。 –
2010-01-05 17:56:43
例如,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