2009-11-27 10 views
2

Ok, j'ai posé cette question auparavant, mais je l'ai supprimée car la façon dont je m'étais décrit pour décrire mon problème était erronée. Tout d'abord, permettez-moi d'indiquer que je crée une application Winforms .NET3.5 en utilisant C# et Plinqo (Linq Professional aux objets) comme ORM. Voici ma situation: j'ai un datagridview qui est peuplé d'un SortableBindingList<T> - dans mon cas, formé d'une List<Task> qui est simplement représentée comme suit:Création d'un filtre Linq dynamique sur la liste <T>

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 veux offrir une boîte de dialogue à mon utilisateur pour lui permettre de filtrer cette liste. J'envisage de transmettre une liste de noms de propriétés et de DataType associé dans la boîte de dialogue que je peux utiliser pour remplir un ComboBox. Ainsi, l'utilisateur choisira la propriété qu'il souhaite interroger à partir de la zone de liste déroulante et, en fonction de la sélection, les comparateurs et le contrôle d'interface utilisateur appropriés seront mis à la disposition de l'utilisateur pour entrer dans ses critères. Enfin, il contiendra un bouton AND/OR à la fin que l'utilisateur peut 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; } 
} 


Après que l'utilisateur construit son/sa requête, je me propose de passer cela comme un List<FilterItem> retour à ma forme d'appel, qui peut alors itérer à travers la liste et permettez-moi de filtrer l'original List<Task>.

Tout va bien, et quelque chose que je peux mettre en place avec facilité. Mais je veux m'assurer que le mécanisme de filtrage ACTUAL auquel je vais est aussi fortement typé que possible, et que je n'utilise pas de chaînes d'agrégation comme dans la bibliothèque de requêtes dynamiques. (Je l'habitude de faire quelque chose de semblable auparavant avec ADO.NET, DataViews et construire dynamiquement une chaîne RowFilter)

Je l'ai lu sur Joseph Albahari de PredicatBuilder et , mais il me semble très confus avec elle et les arbres d'expression en général. Je cherche sincèrement votre aide pour m'aider à mieux comprendre ces concepts et comment l'utiliser pour que mon architecture puisse fonctionner avec.

Beaucoup d'appréciation!

Répondre

2

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 évolutive et « dynamique ».

+0

nevermind ... Je m'en tiendrai là pour l'instant – Shalan