【问题标题】:Filter rows in a table using ASP.NET Dynamic Data Entities使用 ASP.NET 动态数据实体过滤表中的行
【发布时间】:2011-07-21 20:46:31
【问题描述】:

目前,ASP.NET 动态数据实体仅支持开箱即用的布尔或外键关系过滤

我将如何实现自定义过滤器,基于值的下拉列表来过滤行?

【问题讨论】:

    标签: c# .net asp.net asp.net-dynamic-data


    【解决方案1】:

    我已经做了类似的事情,只是将 where 参数添加到 GridView 的数据源。假设您的用户从下拉列表中选择颜色代码 9。在 Page_Init 上,设置参数。

    Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" };
    GridDataSource.WhereParameters.Add(p);
    GridDataSource.Where = "ColorId == @ColorSelection";
    

    【讨论】:

    • 我确实考虑过采用这种方法,但这样做的问题是我们需要在编译时提前知道表的底层细节,例如类型、列名。为了以通用的方式解决这个问题,我做了一些研究,发现必须使用表达式树来动态组合 LINQ 谓词在附加到 Column.ParentTable.GetQuery() 的底层 IQueryable 上
    【解决方案2】:

    我想出了一种方法来做到这一点,以便它适合 ASP.NET 动态数据使用的预期模板系统

    基本上,这个问题是我们在编译时不知道可能被过滤的底层列是什么,更不用说它是什么类型或列名了——这是引导我找到实现解决办法是Filter控件都有一个GetQueryable方法

    不幸的是,此方法适用于 IQueryable 而不是 IQueryable<T> 的实例,因此我们无法简单地使用标准 LINQ 运算符。我们需要的是一种动态创建谓词(甚至是谓词链 - 但是在这种情况下,我想做的只是获取不同的条目并对其进行排序)的方法,然后我们可以将其应用于IQueryable

    不幸的是,动态 LINQ 没有开箱即用的实现,因此我们必须使用表达式树 - 如何解决此问题的第二个提示是 IQueryable 对象公开了一个 .Expressions 集合

    我们需要做的是创建表达式树来表示谓词(在这种情况下用于选择 distinct),然后将其附加到 IQueryable 并返回它。这当然不是一个显而易见的任务,也不是直截了当的任务,我当然没有找到易于理解的表达式树,但这就是我解决问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2014-12-19
      相关资源
      最近更新 更多