在List <t> </t>上创建动态Linq过滤器

时间:2009-11-27 12:24:19

标签: winforms dynamic filter linq-to-objects

好的,之前我问过这个问题,但删除了它,因为我描述问题的方式是错误的。

首先,让我说明我使用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的PredicatBuilderan article on tomasp.net,但我似乎对它和表达树很困惑。

我真诚地寻求您的帮助,帮助我更好地理解这些概念,以及如何使用它,以便我的目标架构可以使用它。

非常感谢!

1 个答案:

答案 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);
}


但这似乎不具备扩展性和“动态性”。