Durchführungsfilter für eine SQL-Tabelle auf einer Anzeigeansicht in ASP.NET MVC (C #) und LINQ-to-SQL?

StackOverflow https://stackoverflow.com/questions/491563

Frage

Ein Follow-up von diese Frage , ich um mein Controller und Routing geändert haben, so dass nun die Sortierwert von? sort zugeordnet = jedoch möchte ich die Fähigkeit zur Umsetzung auch für Anwender, die Tabelle zu filtern, basierend auf eine ausgewählte Gruppe von Werten:

Techniker: Tech1, Tech2, Tech3, usw. Kategorie: Kategorie 1, Kategorie 2, Kategorie 3, usw. Priorität:. Priority1, Priorität 2, Schwerpunkt 3, etc

Ich verwende nur eine Tabelle zur Zeit, so dass der einfachste Weg, um die Liste der verfügbaren Kategorien zu erhalten, nach dem gefiltert werden verschiedene Werte der Kategorie aus der Tabelle auszuwählen. Sie sind alle Eingaben über HTML s so dass ich die Kontrolle über das, was in gesetzt wird. Ich will nicht, sie alle in verschiedenen Tabellen aufzuspalten nur noch, ich versuche so viel zu tun, wie ich mit einer Tabelle kann jetzt aber wenn dies ist das Szenario, das das ein-Tisch-Modell dann fein bricht, ich einstellen kann.

den Anwendungsfall zu klären, ist es wahrscheinlich am besten einen schnellen Screenshot der Ansicht in Frage zu zeigen:

http://images.robburke.ie/stackoverflow/491563.png
Klicken Sie in voller Größe zu sehen.

Ich möchte ein System implementieren, wodurch ein Benutzer könnte zum Beispiel Filter „Priority“, um nur Fragen, bei denen Priorität war „Investigative.

Ich suche nach Anregungen, wie dies sowohl für die vorderen und hinteren Ende auf implementieren. Ich habe versucht, eine Website zu finden, das etwas ähnliches mit Datentabellen tut, aber ich kann eines der Spitze von meinem Kopf nicht denken, obwohl ich bin sicher, dass dies ein Feature, das hundertmal vor umgesetzt wurde!

Kann mir jemand eine gute Art und Weise empfehlen, dies zu tun?

War es hilfreich?

Lösung

Server Tier

Lassen Sie uns mit einigen Pseudo-Code starten.

public ActionResult Open(string sort, string technician, 
    string category, string priority)
{
    // generate query
    // filter stuff
    // order/sort stuff
}

Es ist wichtig, die Reihenfolge der Operationen richtig, hier zu bekommen. Bestimmte IQueryable-Anbieter ( Ich freue mich auf Sie, Entity Framework ) wird still Bestellung ignorieren, wenn es vor der Filterung kommt. So starten Sie durch eine ungeordnete, ungefilterten Abfrage, wie bei Ihrer letzten Frage zu erzeugen, dann fügen Sie die Filterung und schließlich die Bestellung anfügen.

Beachten Sie, dass ich ein Argument zu Ihrer Aktion für alle möglichen Filtergehäuse hinzugefügt haben. Das ist eine Möglichkeit, es zu tun. Siehe andere Art und Weise, es zu tun wäre Filterung auf, damit so gut wie alles, indem Sie die Query-String-Parameter Iterieren (innerhalb von Request) bei der Behandlung von nichts „Art“ als potentielle Filter genannt. Sie sollten entscheiden, was am besten zu Ihrer Anwendung paßt.

Nun, wie implementieren Sie tatsächlich die Filterung? Was Marc zeigte eine Möglichkeit. Das funktioniert wirklich gut, wenn es nur für bestimmte Fälle die Sie filtern möchten. Offensichtlich würde ich es in einem Hilfsmethode setzen, anstatt in der Handlung selbst. Die Chancen stehen gut Sie diese Helfer und andere Aktionen zur Wiederverwendung müssen. Wenn Sie jedoch beabsichtigen, sich auf mehrere Zeilen zu bieten Filterung, als Sie in einem einzigen Verfahren zu buchstabieren kümmern, wäre eine andere Möglichkeit, die Microsoft Dynamics LINQ-Bibliothek zu verwenden, die Sie von CodePlex erhalten. Auf diese Weise können Sie eine LINQ .Where bauen Strings anstelle von Lambda-Ausdrücke verwenden.

Browser Tier

Nun, da Ihre Anwendung kann damit umgehen, müssen Sie ein Verfahren zur Herstellung einer Verbindung zu schaffen, die wie folgt aussieht:

http://example.com/Issue/Open?sort=ID&priority=Investigative

Wenn Sie ein Menü mit Filteroptionen haben, zum Beispiel jeden Menüpunkt eine Verbindung mit verschiedenen Query-String-Parametern entsprechen würde.

Dies ist ein wenig schwierig, weil Sie wahrscheinlich die vorhandenen Abfrage-String-Parameter erhalten möchten, wenn Sie einen neuen hinzufügen. Zum Beispiel, wenn ein Benutzer der offenen Fragen nach ID sortiert hat, und wählt nur Ermittlungs vorrangige Themen zu filtern, dann würden Sie noch gerne die Art erhalten. Also alle Links im Menü müssen die Query-String-Parameter für die aktuell angezeigte Seite als auch die Query-String-Parameter für den Menüpunkt selbst aufzunehmen.

So ist der allgemeine Ansatz, den wir nehmen, wenn dies zu tun ist, für jedes Element in dem „Filtermenü“ (oder was auch immer verknüpfen Sie Ihr Gebäude):

  1. Erstellen Sie eine Routevaluedictionary von Query-String-Parameter
  2. Fügen Sie alle Parameter Query-String auf die aktuelle Ansicht auf das Wörterbuch übergeben.
  3. Fügen Sie eine zusätzliche Abfrage-String-Parameter für den aktuellen Menüpunkt.
  4. Erzeugen der endgültigen URL Html.RouteLink und das Wörterbuch wir gebaut.

Andere Tipps

Ich verstehe nicht vollständig den Anwendungsfall - aber Sie können Filter leicht über IQueryable<T> hinzufügen:

var query = /* your primary query */

if(!string.IsNullOrEmpty(name)) {
    query = query.Where(row => row.Name == name);
}

if(activeOnly) {
    query = query.Where(row => row.IsActive);
}

etc.

Sie können anspruchsvollere Dinge tun manuell durch den Aufbau eines Expression, aber die oben hat den Vorteil, zu debuggen leicht zu sein, und Compiler-geprüft (der Compiler sicherzustellen, dass es eine geeignete IsActive Eigenschaft ist, usw.)

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