2010-01-05 5 views
2

J'ai une liste de produits provenant d'un dépôt. Assez simple. Maintenant, je veux ajouter le filtrage et le tri. Le tri peut avoir lieu en dehors du référentiel car il n'y a pas de gains d'efficacité à les faire dans le référentiel (deviner). Je ne pouvais pas imaginer faire du filtrage en dehors du référentiel puisque nous ne voulons que charger les enregistrements qui nous intéressent. Je pense que vous voudriez créer un délégué de filtre et le passer au référentiel.Dépôt simple Question à propos du filtrage et du tri

Le code ci-dessous est un pseudo code C#. À quoi ressemblerait le code de fonctionnement pour trier/filtrer?

Le processus ci-dessous est vraiment centré sur les délégués de passer au dépôt de filtrer:

Product myProduct = Repo.GetProducts(filter); 

(si cela était MS MVC, ce code existe dans le contrôleur):

Configuration d'un filtre :

//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** 

une sorte d'installation:

// 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); 

Retourner un modèle de vue:

// 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); 

Comme vous pouvez le voir, ce code a besoin d'aide. Je suis vraiment à la recherche de tri et de code de classe de filtre qui pourrait faire ce travail, ou des liens vers des sources extérieures. Je suppose que le tri et le filtrage sont une pratique courante dans les modèles DDD et de conception, d'où la question. Supposons que le produit est un simple produit de commerce électronique;) Les notes Ajax de Rob Conery sont here

Merci.

Répondre

4

Idéalement, vous voudrez probablement effectuer le tri et le filtrage dans le référentiel. Ceci est particulièrement important si vous chargez des collections volumineuses, car la base de données sera très probablement capable de trier plus efficacement que vous ne le pouvez et de renvoyer directement les résultats triés.

L'interface IQueryable<T> est conçue pour gérer cela proprement - c'est la base pour Entity Framework, LINQ to SQL, et d'autres bases de données avec un fournisseur LINQ. La bonne chose à propos d'essayer de soutenir (au moins à un certain niveau) IQueryable<T> est que cela vous permet d'utiliser votre référentiel d'une manière très standard. Par exemple, votre pseudo-code, en utilisant IQueryable<T>, pourrait ressembler davantage:

IList<Product> myProducts = Repo.Products.Where(p => p.Category == theCategoryToFind).OrderBy(p => p.Name); 

Ou, le cas échéant, il suffit:

var products = from p in Repo.Products 
       where p.Category == theCategory 
       order by p.Name 
       select p; 

Je recommande de voir comment certaines des technologies d'accès aux données axées sur LINQ travail - Il y a quelques options open source, telles que Subsonic (ainsi que de nombreuses options commerciales) qui peuvent fournir des indices sur la meilleure façon de concevoir ceci pour la facilité d'utilisation.

+0

Vous dites donc que l'ORM devrait fournir un tri et un filtrage pour vos classes POCO, par exemple si vous utilisez des modèles d'itérateur, etc. –

+0

Idéalement, oui. Vous voulez que l'ORM et la couche de données gèrent le tri et le filtrage, car la base de données doit gérer cela. En utilisant IQueryable , le filtre + tri réel est mappé directement à la base de données. –

+0

Par exemple, Linq to Sql prend en charge .Where. Donc j'utiliserais dc.Products.where (x => x.Name.contains ("Hammer")), et continuerais à ajouter.Wheres aussi longtemps que j'avais des filtres supplémentaires. Donc je devrais construire une grosse instruction foreach dans mon Repository pour accepter une liste de conditions puis les appliquer comme méthodes .where()? En ce qui concerne le tri, je ferais la même chose, comme .OrderBy (x => x.Name)? Construire ces délégués dans mon contrôleur, puis les passer en tant que paramètres dans la méthode de référentiel? –

Questions connexes