繁体   English   中英

将用户生成的查询传递给n层应用程序

[英]Passing a user generated query down an n-tiered application

在我的应用程序中,我使用数据访问层(DAL)生成计划旧CLR对象(PO​​CO),该对象将被发送到我的业务层(BL)。 然后,BL使用模型视图ViewModel(MVVM)模式创建对象以绑定到我的表示层(PL)。

我想让我的用户能够在列级别过滤数据。 例如http://demos.telerik.com/aspnet-ajax/grid/examples/generalfeatures/filtering/defaultcs.aspx

还有其他执行类似功能的网格控件,但总的来说,这就是我要提供的用户体验。

我有一个很大的数据集,所以我想在服务器端进行所有的分页/排序/过滤。

将分页/排序数据沿n层体系结构发送到我的DAL是微不足道的,因此我只提取我感兴趣的记录。

但是,我不确定如何将筛选器数据发送到我的DAL,因为用户可以生成任意长的筛选器表达式。

我的问题是: 通过n累累的应用程序发送用户生成的过滤器表达式的方法什么?

我的想法:

  • 如果我的数据结构与对象结构相同,并且与视图向用户展示的对象结构相同,那么我的生活将会更加轻松。 但是,我的数据结构无法像许多控件提供者所喜欢的那样轻松地映射到用户视图。
  • 许多网格控制提供程序都提供服务器端功能,但它们需要一个才能使用其Linq提供程序。 这会破坏我的体系结构的许多元素。
  • Grid控件确实会生成一个表达式“字符串”,我可以将其传递给DAL并对其进行解释。 但是,这会将我的DAL耦合到此特定的控制表达式字符串格式。
  • 我可以创建一个“表达式树”,将其作为参数传递给我的DAL。 因此,我只需要为表达式树编写一次DAL解释器。 然后,对于任何Grid控件,我都必须生成适当的表达式树以将其传递下来。

只是一个意见,但我会不惜一切代价避免进行解析。 我也会尽可能鼓励使用强类型数据。

我本人会接受“表达式树”的想法。 我已经在大型应用程序中使用了它,没有太大的问题。 由于我们使用的是.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM