C# Formula()方法使用fluent nhibernate生成错误的SQL查询
我正在尝试对一个属性进行特定的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('')
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路径方面存在缺陷。要解决这个问题,您必须创建您自己的拦截器,如本例所示我考虑过这个解决方案,但不幸的是,我无法做到这一点。