Frage

Ich habe eine Liste von Produkten aus einem Repository kommen. Einfach genug. Jetzt möchte ich Filterung und Sortierung hinzuzufügen. Sortierung außerhalb des Repository passieren könnte, da es keine Effizienzgewinne sie innerhalb des Repository (Vermutung) zu tun sind. Ich konnte tun Filterung außerhalb des Endlagers nicht vorstellen, da wir nur laden Aufzeichnungen wollen wir kümmern uns um. Ich würde denken, dass Sie einen Filter delegieren erstellen möchten und es in das Repository übergeben.

Der Code unten ist Pseudo-C # -Code. Was würde Code funktionieren aussehen mag / Filter sortieren?

Der Prozess unten wirklich in das Repository um vorbei Delegierten zentriert zu filtern:

Product myProduct = Repo.GetProducts( filter );

(wenn dies MS MVC ist, dieser Code würde in der Steuerung vorhanden ist):

Setup ein Filter:

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

Setup eine Art:

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

Gibt ein Ansichtsmodell:

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

Wie Sie sehen können, muss dieser Code etwas Hilfe. Ich freue mich wirklich für Sortier- und Filterklasse Code, der diese Arbeit, oder Links zu externen Quellen machen könnte. Ich gehe davon aus dem Sortieren und Filtern sind eine gängige Praxis in DDD und Entwurfsmustern, also die Frage. Es sei angenommen, Produkt ist ein gutes altes E-Commerce-Produkt;) Rob Conery Ajax Noten sind hier

Danke.

War es hilfreich?

Lösung

Idealerweise verfügen Sie wollen wahrscheinlich die Sortierung und die Filterung innerhalb des Repository zu tun. Dies ist besonders wichtig, wenn Sie große Sammlungen einlegen, da die DB wahrscheinlich in der Lage sein wird, effizienter zu sortieren, als Sie tun können, und kehrt die sortierten Ergebnisse direkt an.

Der IQueryable<T> Schnittstelle ausgelegt ist, diese sauber zu handhaben - es ist die Grundlage für Entity Framework, LINQ to SQL und andere Datenbanken mit einem LINQ-Anbieter. Das Schöne daran versuchen (zumindest zu einem gewissen Grad) IQueryable<T> zu unterstützen, ist das Sie das Repository in eine sehr Standard Weise nutzen kann. Zum Beispiel Ihres Pseudo-Code, mit IQueryable<T> könnte aussehen wie:

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

oder optional nur:

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

Ich empfehle schauen, wie einige der LINQ-orientierten Datenzugriffstechnologien arbeiten - es gibt eine ganze Reihe von Open-Source-Optionen, wie zB Subsonic (sowie viele kommerzielle Optionen), die Hinweise darauf, wie man besser dies für Usability Design kann bereitstellen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top