好的,之前我问过这个问题,但删除了它,因为我描述问题的方式是错误的。
首先,让我说明我使用C#和Plinqo(Professional Linq to Objects)创建一个.NET3.5 Winforms应用程序作为我的ORM。这是我的情况:我有一个从SortableBindingList<T>
填充的DataGridview - 就我而言,由List<Task>
组成,简单表示如下:
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; }
}
现在,我想为我的用户提供一个Dialog,允许他/她过滤此列表。我设想将属性名称和关联的DataType列表传递到Dialog中,我可以使用它来填充ComboBox。因此,用户将从组合框中选择他们想要查询的属性,并根据选择,使用户可以使用适当的比较器和UI控件输入其标准。最后,它将在末尾包含AND / OR togglebutton,用户可以使用它来添加其他标准。每个标准都是FilterItem
类型的对象,如下所示:
public class FilterItem {
public string MappedPropertyName { get; set; }
public enumComparer Comparer { get; set; }
public object FilterValue { get; set; }
public enumOpertor Operator { get; set; }
}
在用户构造他/她的查询之后,我打算将此作为List<FilterItem>
传递回我的调用表单,然后可以通过列表进行迭代并允许我过滤原始List<Task>
。
这一切都很好,我可以轻松放在一起。但我想确保我使用的ACTUAL过滤器机制尽可能强类型,而不是像动态查询库中那样使用bulit up字符串。 (我以前用ADO.NET,DataViews和动态构造RowFilter字符串做过类似的事情)
我已经读过Joseph Albahari的PredicatBuilder和an article on tomasp.net,但我似乎对它和表达树很困惑。
我真诚地寻求您的帮助,帮助我更好地理解这些概念,以及如何使用它,以便我的目标架构可以使用它。
非常感谢!
答案 0 :(得分:2)
此外,我知道我可以做类似的事情:
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);
}
但这似乎不具备扩展性和“动态性”。