C# Formula()方法使用fluent nhibernate生成错误的SQL查询

C# Formula()方法使用fluent nhibernate生成错误的SQL查询,c#,sql,nhibernate,fluent-nhibernate,C#,Sql,Nhibernate,Fluent Nhibernate,我正在尝试对一个属性进行特定的SQL查询。我用的是公式法 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('')

我正在尝试对一个属性进行特定的SQL查询。我用的是公式法

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命令并将表名粘贴到该命令


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

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

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

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

Map(p => p.TitleUpper).Formula("(Upper(Title))");
Upper是内置的MSSQL函数

现在,nHibernate将识别出标题是映射实体的属性,并且在生成任何查询时,它将使用正确的表前缀作为标题的前缀

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

只有这样,即使您有非常复杂的查询,nHibernate也可以将属性映射到实体。

不幸的是,nHibernate在理解XML路径方面存在缺陷。要解决这个问题,您必须创建您自己的拦截器,如本例所示

我考虑过这个解决方案,但不幸的是,我无法做到这一点。