Question

D'accord, j'ai déjà posé cette question, mais je l'ai supprimée car je décrivais mal mon problème.

Tout d’abord, laissez-moi vous dire que je suis en train de créer une application .NET3.5 Winforms en utilisant C # et Plinqo (Professional). Linq to Objects) comme mon ORM. Voici ma situation: j'ai un DataGridview qui est rempli à partir d'un SortableBindingList < T > - dans mon cas, formé à partir d'une liste < tâche > qui est simplement représentée comme suit:

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; }
}  


Maintenant, je souhaite fournir un dialogue à mon utilisateur pour lui permettre de filtrer cette liste. J'envisage de passer une liste de noms de propriétés et de DataType associé dans le dialogue que je peux utiliser pour renseigner une zone de liste déroulante. Ainsi, l'utilisateur choisira la propriété qu'il souhaite interroger dans la liste déroulante et, en fonction de la sélection, les comparateurs et le contrôle d'interface utilisateur appropriés seront disponibles pour que l'utilisateur puisse les entrer dans leurs critères. Enfin, il contiendra un bouton-poussoir AND / OR à la fin que l'utilisateur pourra utiliser pour ajouter un critère supplémentaire. Chaque critère sera un objet de type FilterItem comme indiqué ci-dessous:

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


Une fois que l’utilisateur a construit sa requête, j’ai l’intention de le transmettre sous forme de Liste < FilterItem & à mon formulaire d’appel, qui peut ensuite parcourir la liste et me permettre de filtrer le d’origine. Répertoriez la < tâche > .

Tout va bien, et quelque chose que je peux facilement assembler. Mais je veux m'assurer que le mécanisme de filtre ACTUAL que j'utilise est aussi typé que possible et n'utilise pas de chaînes compressées comme dans la bibliothèque de requêtes dynamiques. (Je faisais auparavant quelque chose de similaire avec ADO.NET, DataViews et la construction dynamique d'une chaîne RowFilter)

J'ai lu des articles sur de PredicatBuilder et un article sur tomasp.net , mais il semble que je sois très confus avec lui et les arbres d'expression en général.

Je sollicite sincèrement votre aide pour m'aider à mieux comprendre ces concepts et pour savoir comment les utiliser afin que l'architecture envisagée puisse fonctionner avec.

Beaucoup d'appréciation!

Était-ce utile?

La solution

De plus, je sais que je peux faire quelque chose comme:

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


mais cela ne semble pas très évolutif et "dynamique".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top