【问题标题】:Passing a user generated query down an n-tiered application将用户生成的查询向下传递到 n 层应用程序
【发布时间】:2010-12-06 01:13:24
【问题描述】:

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

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

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

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

将分页/排序数据沿 n 层架构发送到我的 DAL 很简单,因此我只会提取我感兴趣的记录。

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

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

我的想法:

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

【问题讨论】:

    标签: c# asp.net architecture


    【解决方案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')
    

    【讨论】:

    • 我的第一个想法是构建自己的结构,但 Linq 表达式树类似乎可以工作,我并不想重新发明轮子。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 2018-12-28
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多