Frage

Ok, fragte ich diese Frage vor, aber es wie die Art und Weise gelöscht ich beschreiben, mein Problem ging, war falsch.

Lassen Sie mich zunächst sagen, dass Im ein NET3.5 WinForms App mit C # erstellen und Plinqo (Professional Linq to Objects) wie meine ORM. Hier ist meine Situation: Ich habe eine Datagridview, die von einem SortableBindingList<T> bevölkert ist - in meinem Fall aus einem List<Task> gebildet, die einfach wird wie folgt dargestellt:

public class Task {
    public long TaskID { get; set; }
    public string TaskDescription { get; set; }
    public enumPriority TaskPriority { get; set; }
    public DateTime DueDate { get; set; }
    public double PercentageComplete { get; set; }
}  


Nun, ich möchte einen Dialog zu meinem Benutzer zur Verfügung zu stellen, um ihm / ihr diese Liste zu filtern. Ich sehe vorbei in einer Liste der Eigenschaftsnamen und zugehörigen Datentypen in den Dialog, die ich verwenden kann, eine ComboBox zu füllen. So wird der Benutzer auswählen, welche Eigenschaft sie von der comboBox abfragen möchten und auf der Grundlage der Auswahl der entsprechenden comparers und UI-Steuerung zur Verfügung gestellt werden für den Benutzer in thier Kriterien eingeben. Schließlich wird es eine UND / ODER ToggleButton am Ende enthält, die der Benutzer zusätzliches Kriterium hinzufügen kann. Jedes Kriterium wird ein Objekt vom Typ FilterItem sein, wie unten dargestellt:

public class FilterItem {
    public string MappedPropertyName { get; set; }
    public enumComparer Comparer { get; set; }
    public object FilterValue { get; set; }
    public enumOpertor Operator { get; set; }
}


Nachdem der Benutzer seine / ihre Abfrage baut, will ich dies als List<FilterItem> zu meiner Berufung Form zurückzugeben, die dann durch die Liste durchlaufen können und mir das Original List<Task> zu filtern.

Das ist alles in Ordnung, und etwas, das ich mit Leichtigkeit zusammenstellen kann. Aber ich möchte sicherstellen, dass die IST-Filtermechanismus ich mit gehen wird so weit wie möglich stark typisierte und nicht bulit up mit Strings wie in der dynamischen Abfrage-Bibliothek. (Ich habe etwas Ähnliches vorher mit ADO.NET, Dataviews zu tun und dynamisch eine RowFilter String Konstruktion)

Ich habe auf Joseph Albahari die lesen PredicatBuilder und ein Artikel über tomasp.net , aber ich glaube, mit ihm und Ausdrucksbäumen im allgemeinen stark verwirrt.

Ich suche aufrichtig Ihre Unterstützung hilft mir besser, diese Konzepte zu verstehen, und wie über die Verwendung bis gehen, so dass meine beabsichtigte Architektur mit ihm arbeiten können.

Viel Anerkennung!

War es hilfreich?

Lösung

Außerdem, ich weiß, ich kann so etwas tun:

private SortableBindingList<Task> GetSortedTaskList()
{
        List<Task> list = new List<Task>();
        var query = DataUtil.GetUserTasks(xSys.Current.UserID);
        if (/*description condition met*/)
        {
            query = query.Where(x => x.TaskDescription.Contains(FilterDesc));
        }
        if (/*due date condition met*/)
        {
            query = query.Where(x => x.DueDate >= FilterDate);
        }
        if (/*priority condition met*/)
        {
            query = query.Where(x => x.TaskPriority == FilterPriority);
        }

    ...

        list = query.ToList();
        return new SortableBindingList<ArcTask>(list);
}


aber dies scheint nicht sehr skalierbar und ‚dynamisch‘.

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