【问题标题】:Creating a Dynamic Linq filter over List<T>在 List<T> 上创建动态 Linq 过滤器
【发布时间】:2009-11-27 12:24:19
【问题描述】:

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

首先,让我声明我使用 C# 和 Plinqo(Professional Linq to Objects)作为我的 ORM 创建了一个 .NET3.5 Winforms 应用程序。这是我的情况:我有一个从 SortableBindingList&lt;T&gt; 填充的 DataGridview - 在我的情况下,它由 List&lt;Task&gt; 组成,简单表示如下:

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


现在,我想为我的用户提供一个对话框以允许他/她过滤此列表。我设想将属性名称列表和关联的 DataType 传递到我可以用来填充 ComboBox 的对话框中。因此,用户将从组合框中选择他们想要查询的属性,并根据选择提供适当的比较器和 UI 控件供用户输入他们的条件。最后,它将在末尾包含一个 AND/OR 切换按钮,用户可以使用它来添加其他标准。每个条件都是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&lt;FilterItem&gt; 传递回我的调用表单,然后它可以遍历列表并允许我过滤原始List&lt;Task&gt;

这一切都很好,而且我可以轻松地组合在一起。但是我想确保我使用的 ACTUAL 过滤器机制是尽可能强类型的,而不是像在动态查询库中那样使用构建的字符串。 (我以前用 ADO.NET、DataViews 和动态构造 RowFilter 字符串做过类似的事情)

我已经阅读了 Joseph Albahari 的 PredicatBuilderan article on tomasp.net,但我似乎对它和一般的表达式树感到很困惑。

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

非常感谢!

【问题讨论】:

    标签: winforms dynamic filter linq-to-objects


    【解决方案1】:

    此外,我知道我可以这样做:

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


    但这似乎不是很有可扩展性和“动态”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2014-10-16
      • 2011-12-31
      相关资源
      最近更新 更多