【问题标题】:How to render Max(Substring) with Lambda Extensions如何使用 Lambda 扩展渲染 Max(Substring)
【发布时间】:2010-05-27 22:37:44
【问题描述】:

我将 NHibernate 与 Lambda 扩展一起使用。我想知道如何用 Substring 嵌套 Max 函数。

以下语句检索Max("invoice_id")

var ret = session
          .CreateCriteria<Invoice>()
          .SetProjection(Projections.Max("invoice_id"))
          .UniqueResult();

但在我的例子中,invoice_id 字段是这样生成的:12345.10,其中 12345 是发票编号,10 是指当前年份(2010 年)。此外,每年发票编号从 1 重新开始。 所以我只需要计算前 5 位的 Max 函数。我该怎么做?

【问题讨论】:

  • 这有关系吗?无论如何,最大值不会相同吗? (即 12345#### vs 12346####,无论最后是什么 4 位数年份,后者仍然是最大值)
  • 当然可以,但是发票编号每年都会从 1 重新开始。对不起,我之前忘记指定了..
  • 现在更有意义了。 :)

标签: c# nhibernate criteria nhlambdaextensions


【解决方案1】:

您可以使用特定于服务器的函数,例如 SUBSTRING(或 DBMS 中的等效函数),如下所示:

var ret = session
.CreateCriteria<Invoice>()
    .SetProjection(
        Projections.Max(
            new SqlFunctionProjection("SUBSTRING", 
                NHibernateUtil.String, 
                Projections.Property("invoice_id"), 
                Projections.Constant(1), 
                Projections.Constant(5))))
    .UniqueResult();

【讨论】:

    【解决方案2】:

    您应该为发票编号创建结构和自定义 NHibernate 类型,而不是依赖字符串操作。

    struct和nh类型将封装所有比较和排序的逻辑。

    http://intellect.dk/post/Implementing-custom-types-in-nHibernate.aspx

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多