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

时间:2009-10-12 16:35:30

标签: c# asp.net architecture

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

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

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

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

将分页体系结构中的分页/排序数据发送到我的DAL是很简单的,所以我只会提取我感兴趣的记录。

但我不知道如何将过滤数据发送到我的DAL,因为用户可以生成任意长的过滤器表达式。

我的问题是:通过我的n-tired应用程序发送用户生成的过滤器表达式有哪些选择。

我的想法:

  • 如果我的数据,我的生活会更轻松 结构与我的对象相同 结构也是一样的 视图是我呈现我的用户。 但是我的数据结构不可能 容易映射到用户视图 许多控制提供商喜欢 在他们的例子中显示。
  • 许多网格控制提供商 提供服务器端功能但是 他们需要一个人使用他们的Linq 供应商。这会打破很多 我的建筑元素。
  • 网格控件确实会生成一个 表达'字符串',我可以 传递给我的DAL并让它解释 它。然而,这将耦合我的DAL 这个特定的控制表达 字符串格式。
  • 我可以创建一个'表达式树' 将它作为参数传递给我的DAL。一世 因此只需要写一个 表达式的DAL解释器 树一次。然后进行任何网格控制 我必须生成 适当的表达树来传递 它失落了。

1 个答案:

答案 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')