1

我正在尝试对一个属性进行特定的 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 命令并粘贴表名。

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

4

2 回答 2

0

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

于 2013-10-04T19:35:12.650 回答
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 才能将属性映射到实体......

于 2013-10-03T09:58:56.503 回答