【问题标题】:NHibernate + ASP.Net MVC - how to order data in strongly typed manned according to user selected fieldNHibernate + ASP.Net MVC - 如何根据用户选择的字段对强类型的数据进行排序
【发布时间】:2010-11-07 00:56:50
【问题描述】:

我正在通过远程排序和分页在网格 (ExtJS) 中为用户呈现数据。假设我有一个包含一些订单的网格。订单实体看起来像 Order{OrderNumber, Customer, Date, Address{Street, City, PostCode}}。 Customer 被 NH 映射为关系,Address 被映射为组件。网格中显示的数据被展平为如下命名的列:OrderNumber、Customer.Number、Customer.Name、Date、Address.Street、Address.City、Address.PostCode。

用户选择他想要排序的列,然后网格将字段名称发送到服务器。现在在服务器端,我需要向后恢复实体属性属于网格字段名称,并确定它是组件还是关系,并使用 CreateAlias + AddOrder 等构建标准。这个逻辑充满了如下代码:

if (gridField=="Customer.Name"){
  cri = cri.createAlias("Customer", "customerAlias");
  cri.AddOrder(Order.Asc("customerAlias.Name"));
}

这已经大大简化了,但它现在看起来一定是这样的。我正在寻找一些通用的更智能的解决方案。有什么想法吗?我现在面临的问题是我可以有一个转换实体属性(包括嵌套组件和关系)的约定,但是我需要一个方法来确定该字段是否像组件或关系一样映射。这将是相当沉重的......

【问题讨论】:

    标签: asp.net-mvc nhibernate strong-typing


    【解决方案1】:

    它会很重。我没有看到一个简单的解决方案,但是如果您打算大量重复使用它,或者需要一些非常强大的东西,您可以构建一个基于反射的系统。

    另一种可能性是使用一些 T4 模板,但这只会帮助解决“字符串”问题,而不是关联问题。

    【讨论】:

      【解决方案2】:

      怎么样:

      cri = cri.CreateAlias( "Customer", "CustomerAlias" );
      string sortProperty = gridField.Replace("Customer.", "CustomerAlias.");
      cri.AddOrder( Order.Asc(sortProperty) );
      

      【讨论】:

      • 这仍然是关于魔术弦的 - 我正在考虑更系统的东西......
      • 至少你不需要在排序中使用的实际字段名中编码
      猜你喜欢
      • 2012-02-08
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多