[英]Passing a user generated query down an n-tiered application
在我的应用程序中,我使用数据访问层(DAL)生成计划旧CLR对象(POCO),该对象将被发送到我的业务层(BL)。 然后,BL使用模型视图ViewModel(MVVM)模式创建对象以绑定到我的表示层(PL)。
我想让我的用户能够在列级别过滤数据。 例如http://demos.telerik.com/aspnet-ajax/grid/examples/generalfeatures/filtering/defaultcs.aspx
还有其他执行类似功能的网格控件,但总的来说,这就是我要提供的用户体验。
我有一个很大的数据集,所以我想在服务器端进行所有的分页/排序/过滤。
将分页/排序数据沿n层体系结构发送到我的DAL是微不足道的,因此我只提取我感兴趣的记录。
但是,我不确定如何将筛选器数据发送到我的DAL,因为用户可以生成任意长的筛选器表达式。
我的问题是: 通过n累累的应用程序发送用户生成的过滤器表达式的方法是什么?
我的想法:
只是一个意见,但我会不惜一切代价避免进行解析。 我也会尽可能鼓励使用强类型数据。
我本人会接受“表达式树”的想法。 我已经在大型应用程序中使用了它,没有太大的问题。 由于我们使用的是.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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.