问题
我正在尝试使用Microsoft的Dynamic Linq Sample和BindingList<T>
个对象。但看起来Dynamic 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 :(得分:0)
BindingList上有一个Extension方法; 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();
}
因此,在下文中,Results1将有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; }
}