4

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

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

4

2 回答 2

0

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

Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" };
GridDataSource.WhereParameters.Add(p);
GridDataSource.Where = "ColorId == @ColorSelection";
于 2011-07-26T18:32:49.997 回答
0

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

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

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

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

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

于 2011-07-26T22:12:36.350 回答