2011-03-22 3 views
1

QuestionDynamic Linq prend-il en charge BindingList <T>?

Je suis en train d'utiliser le Dynamic Linq Sample de Microsoft avec BindingList<T> objets. Mais il semble que le Dynamic Linq ne fonctionnera qu'avec IQueryable. Quel est le problème ici, pourquoi ne pas BindingList<T> mettre en œuvre IQueryable. Et y a-t-il un moyen de contourner cela?


détail fond: J'ai beaucoup de jeux de données que j'ai besoin de filtrer dynamiquement au moment de l'exécution. Voici un exemple:

BindingList<MyObject> list = new BindingList<MyObject>(); 
MyObject selectedObj = list.FirstOrDefault(o => o.Name == "Master P") 

// then later ... 
MyObject selectedObj = list.FirstOrDefault(o => o.City == "Boston") 

Je suis en train de faire ces requêtes dynamiques, de sorte que l'utilisateur peut choisir parmi toutes les propriétés de MyObject à utiliser dans la requête.

Répondre

0

Il existe une méthode d'extension sur BindingList; AsQueryable(). Vous pouvez donc utiliser

list.AsQueryable(); 

Mais si vous voulez effectuer une recherche sur tous les critères que vous pourriez créer une recherche qui utilise une instance de MyObject comme les critères de recherche, puis généré un jeu de résultats sur la base des critères de l'objet en utilisant la norme lien.

Par exemple:

public List<MyObject> Search(MyObject SearchCriteria) 
    { 
     BindingList<MyObject> list = new BindingList<MyObject>(); 
     list.Add(new MyObject("Test", "Boston")); 
     list.Add(new MyObject("Test2", "Atlanta")); 

     IEnumerable<MyObject> results = list.AsEnumerable(); 
     if (!String.IsNullOrEmpty(SearchCriteria.Name)) 
      results = results.Where(l => l.Name.Contains(SearchCriteria.Name)); 
     if (!String.IsNullOrEmpty(SearchCriteria.City)) 
      results = results.Where(l => l.City.Contains(SearchCriteria.City)); 
     return results.ToList(); 

    } 

Ainsi, dans ce qui suit, Résultats1 aura 2 résultats et les résultats 2 aura seulement 1.

List<MyObject> results1 = Search(new MyObject("Test", "")); 
List<MyObject> results2 = Search(new MyObject("Test", "Boston")); 

J'ai utilisé une structure simple pour MyObject comme un exemple ceci:

public class MyObject 
{ 
    public MyObject(string name, string city) 
    { 
     this.Name = name; 
     this.City = city; 
    } 
    public string Name { get; set; } 
    public string City { get; set; } 
}