目前,ASP。NET动态数据实体仅支持对布尔值或外键关系进行过滤
我如何实现一个自定义过滤器,基于值的下拉列表来过滤行?
我已经做了一些类似的使用只是添加参数到GridView的数据源。假设您的用户从下拉菜单中选择了Color Code 9。在Page_Init上设置参数
Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" };
GridDataSource.WhereParameters.Add(p);
GridDataSource.Where = "ColorId == @ColorSelection";
我想出了一种方法来做到这一点,使它适合预期的模板系统,ASP。. NET动态数据使用
基本上,这个问题是我们在编译时不知道可能被过滤的底层列是什么,更不用说它是什么类型或列名了-引导我实现解决方案的第一个线索是过滤器控件都有一个方法GetQueryable
不幸的是,该方法适用于IQueryable
而不是IQueryable<T>
的实例,因此我们无法简单地使用标准LINQ操作符。我们需要的是一种动态创建谓词(甚至谓词链)的方法-然而,在这种情况下,我想做的只是获得不同的条目并对它们进行排序),然后我们可以将其应用于IQueryable
不幸的是,动态LINQ没有现成的实现,因此我们必须使用表达式树——如何解决这个问题的第二个提示是IQueryable
对象公开了一个。expressions集合
我们需要做的是创建表达式树来表示谓词(在本例中用于选择distinct),然后将其附加到IQueryable
并返回它。这当然不是一个明显的,也不是直截了当的任务,我当然也没有发现表达式树容易理解,但这就是我解决问题的方法。