Formula()方法生成错误的sql查询flunet nhibernate

时间:2013-10-03 09:31:26

标签: c# sql nhibernate fluent-nhibernate

我正在尝试在一个属性上进行特定的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.双字改变字符单引号 2. NHibernate转换器无法识别XML命令和粘贴表名。

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

2 个答案:

答案 0 :(得分:0)

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可以将属性映射到实体......

答案 1 :(得分:0)

不幸的是,nHibernate在理解FOR XML PATH时有一个错误。要解决此问题,您必须创建自己的Interceptor,如此示例所示nHibernate FOR XML PATH bug