Nhibernate Criteria Conditional Where

时间:2012-10-01 07:56:40

标签: sql nhibernate case criteria where

我正在研究NHibernate标准,我根据输入参数逐步构建upp。

我在这些参数的邮政部分遇到了一些问题。 由于我们得到了5位数字的zipcodes,输入参数是一个int,但由于我们在数据库中也接受外部zipcodes,因此数据库将其保存为字符串。

我试图在NHibernate Criteria / Criterion中复制的是以下where子句。

WHERE
11182 <=
    (case when this_.SendInformation = 0 AND dbo.IsInteger(this_.Zipcode) = 1 then
        CAST(REPLACE(this_.Zipcode, ' ', '') AS int)
    when this_.SendInformation = 1 AND dbo.IsInteger(this_.WorkZipcode) = 1 then
        CAST(REPLACE(this_.WorkZipcode, ' ', '') AS int)
    when this_.SendInformation = 2 AND dbo.IsInteger(this_.InvoiceZipcode) = 1 then
        CAST(REPLACE(this_.InvoiceZipcode, ' ', '') AS int)
    else
        NULL
    end)

我们所做的是检查成员联系人(this_)优先获取发送信息的位置,然后根据列是否可转换为int,将输入邮政编码检查为三个不同列的整数( IsInteger(expr)函数)如果列不可转换,我们将该边标记为NULL

在这种情况下,我们只检查zipcode是否是&gt; =输入参数(在sql代码中反转,因为参数是第一个),目标是做一个(两个包含'AND'语句的子句),&gt; =或&lt; =。

更新

有一丝成功。

Projections.SqlProjection("(CASE when SendInformation = 0 AND dbo.IsInteger(Zipcode) = 1 then CAST(REPLACE(Zipcode, ' ', '') AS int) when SendInformation = 1 AND dbo.IsInteger(WorkZipcode) = 1 then CAST(REPLACE(WorkZipcode, ' ', '') AS int) when SendInformation = 2 AND dbo.IsInteger(InvoiceZipcode) = 1 then CAST(REPLACE(InvoiceZipcode, ' ', '') AS int) else NULL END)"
                , new[] { "SendInformation", "Zipcode", "WorkZipcode", "InvoiceZipcode" },
                new[] { NHibernateUtil.Int32, NHibernateUtil.String, NHibernateUtil.String, NHibernateUtil.String });

将我的整个子句抛出一个Projections.SqlProjection,但是当我运行我的代码时,我的一些投影被剪切(“AS int”,否则为NULL END)“从末尾开始剪切”并使sql损坏。 对此有什么限制吗?

1 个答案:

答案 0 :(得分:0)

昨天工作了。

Projections.SqlProjection有效,但是如果你没有将投影命名为列,那么它会如何削减一些TSQL代码。

(Case
    when x = 1 then 'bla'
    when x = 2 then 'bla_bla'
    else NULL
 END) as foo

当使用最后一部分(as foo)并命名整个案例语法时,它可以工作,不会删除任何内容。

但是我不知道为什么但是我无法使用标准其他部分的别名。