在我的应用程序中,我使用我的数据访问层(DAL)生成计划旧CLR对象(POCO),并将其发送到我的业务层(BL)。然后,BL使用模型视图ViewModel(MVVM)模式创建要绑定到我的表示层(PL)的对象。
我想让我的用户能够在列级别上过滤数据。例如 http://demos.telerik.com/aspnet-ajax/grid/examples/generalfeatures/filtering/defaultcs.aspx
还有其他网格控件执行类似的功能,但一般来说这是我想要提供的用户体验。
我有一个大型数据集,所以我想在服务器端进行所有分页/排序/过滤。
将分页体系结构中的分页/排序数据发送到我的DAL是很简单的,所以我只会提取我感兴趣的记录。
但我不知道如何将过滤数据发送到我的DAL,因为用户可以生成任意长的过滤器表达式。
我的问题是:通过我的n-tired应用程序发送用户生成的过滤器表达式有哪些选择。
我的想法:
答案 0 :(得分:1)
只是一个意见,但我会不惜一切代价避免解析。我也鼓励尽可能使用强类型数据。
我自己会选择“表达树”的想法。我在大型应用程序中使用它没有太多问题。我们构建了自己的实现来表示表达式,因为我们使用.Net 2.0并且不需要很多支持(仅限相等)。我不能从你的帖子中看出你是否正在考虑建立自己的,但我们想出了类似的内容:
class ValueTriple {
System.Type FieldType;
string Field;
object Value;
}
class AndCritieria {
ValueTriple[] Criteria;
}
class OrCriteria {
AndCriteria[] Criteria;
}
我们使用特定于实体的富类型“查询”类包装这些类,并最终使用排序/分页信息扩展OrCriteria。上面的查询结构使我们能够通过基本上规范化输入查询结构来表达任何基于相等的条件而不管复杂性。例如:
WHERE x = '1' AND (y = '2' OR z = '3')
也可以表示为:
WHERE (x = '1' AND y = '2') OR (x = '1' AND z = '3')