2011-03-22 58 views
1

问题动态Linq支持BindingList <T>?

我试图使用来自微软的Dynamic Linq SampleBindingList<T>对象。但它看起来像动态Linq将只能使用IQueryable。这里的交易是什么,为什么BindingList<T>实施IQueryable。有没有办法解决这个问题?


背景细节:我有,我需要在运行时动态筛选许多数据集。这里有一个例子:

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") 

我试图让这些查询动态的,所以用户可以从MyObject所有属性选择在查询中使用。

回答

0

BindingList上有一个扩展方法; AsQueryable已()。所以,你可以使用

list.AsQueryable(); 

但是,如果你要搜索的所有条件,你可以创建一个使用的MyObject的实例作为搜索条件进行搜索,然后基于对象使用标准的标准产生的结果集链接。

例如:

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

    } 

所以在下文中,结果1将具有2分的结果和结果2将仅具有1

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

我用于MyObject来简单的结构作为一个例子这个:

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