【问题标题】:Formula() method generate wrong SQL query with fluent nhibernateFormula() 方法使用流畅的 nhibernate 生成错误的 SQL 查询
【发布时间】:2013-10-03 09:31:26
【问题描述】:

我正在尝试对一个属性进行特定的 SQL 查询。我正在使用 Formula() 方法。

mapping.Map(o => o.LeadingPeopleText).Formula(@"(SELECT u.FirstName + ' ' + u.LastName + ', ' FROM PanelLawyer_LedCases_System_Users ld LEFT JOIN System_Users u ON ld.UserFk = u.Id WHERE ld.CaseFk = Id FOR XML PATH(''))");

NHibernate 像这样生成这个公式:

(SELECT u.FirstName + '' '' + u.LastName + '','' FROM PanelLawyer_LedCases_System_Users ld LEFT JOIN System_Users u ON ld.UserFk = u.Id WHERE ld.CaseFk = case0_.Id FOR case0_.XML PATH('''')) AS formula0_2_

有两个问题:
1. 字符单引号在double上改变
2. NHibernate 翻译器无法识别 XML 命令并粘贴表名。

也许有人知道如何解决这个问题。

【问题讨论】:

    标签: c# sql nhibernate fluent-nhibernate


    【解决方案1】:

    NHibernate 解析您的查询并尝试通过添加内部使用的前缀使其适用于子查询等。为什么它会在 FOR XML 语句前加上前缀,我不知道,但通常我认为做这样的事情是一个非常糟糕的主意......

    也许您应该尝试创建一个服务器函数(不是存储过程),它会为您运行该查询,并且您只需在公式中使用对象的 id 调用该函数。

    例如,如果我有一个实体,其属性名为 Title,它是一个字符串,我也可以将它映射到包含大写标题的属性 TitleUpper

    Map(p => p.TitleUpper).Formula("(Upper(Title))");
    

    Upper 是内置 MSSQL 函数。

    现在 nHibernate 将识别 Title 是我的映射实体的属性,并且在生成任何查询时,它会在 Title 前面加上适当的表前缀。

     select post0_.Id as Id3_, 
       , post0_.Title as Title3_
       , (Upper(post0_.Title)) as formula0_ from Posts post0_
    

    只有这样 nHibernate 才能将属性映射到实体,即使您有非常复杂的查询...

    【讨论】:

    • 我想过这个解决方案,但不幸的是我做不到。
    【解决方案2】:

    不幸的是,nHibernate 在理解FOR XML PATH 方面存在错误。要解决此问题,您必须创建自己的 Interceptor,如本示例中所示 nHibernate FOR XML PATH bug

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2017-10-19
      • 2014-12-06
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多