2015-12-03 86 views
3

错误:NHibernate的CreateSQLQuery错误 - SetParameterList附近有语法错误 ''

System.Data.SqlClient.SqlException: Incorrect syntax near ','

代码:

IQuery permissionTypes; 

if (regionIds != null && regionIds.Count > 0) 
{ 
    permissionTypes = session.CreateSQLQuery(
     @"SELECT DISTINCT PT.PermissionType FROM AspNetUsers AU 
     INNER JOIN AspNetUserRoles AR ON AU.Id= AR.UserId 
     INNER JOIN dbo.AspNetRoles ANR ON ANR.Id = AR.RoleId 
     INNER JOIN [dbo].[tbl_RolePermissionTypeAssoc] RPT ON RPT.FK_RoleId = AR.RoleId 
     INNER JOIN tbl_PermissionType PT ON RPT.FK_permissionTypeId=PT.Id 
     WHERE AU.ID=:userId AND ANR.RegionId=:regionId") 
     .SetParameter("userId", userId).SetParameterList("regionId", regionIds); 
} 
else 
{ 
    permissionTypes = session.CreateSQLQuery(
     @"SELECT DISTINCT PT.PermissionType FROM AspNetUsers AU 
     INNER JOIN AspNetUserRoles AR ON AU.Id= AR.UserId 
     INNER JOIN dbo.AspNetRoles ANR ON ANR.Id = AR.RoleId 
     INNER JOIN [dbo].[tbl_RolePermissionTypeAssoc] RPT ON RPT.FK_RoleId = AR.RoleId 
     INNER JOIN tbl_PermissionType PT ON RPT.FK_permissionTypeId=PT.Id 
     WHERE AU.ID=:userId AND ANR.RegionId=:regionId") 
     .SetParameter("userId", userId); 
} 

return permissionTypes.List<string>(); 

生成的查询:

SELECT DISTINCT PT.PermissionType 
FROM AspNetUsers AU 
INNER JOIN AspNetUserRoles AR ON AU.Id = AR.UserId 
INNER JOIN dbo.AspNetRoles ANR ON ANR.Id = AR.RoleId 
INNER JOIN [dbo].[tbl_RolePermissionTypeAssoc] RPT ON RPT.FK_RoleId = AR.RoleId 
INNER JOIN tbl_PermissionType PT ON RPT.FK_permissionTypeId = PT.Id 
WHERE AU.ID = @p0 AND ANR.RegionId = @p1, @p2 

回答

2

这里的要点是=标志,它不能用于更多参数。我们需要IN操作

resluting SQL包含

AND ANR.RegionId = @p1, @p2 

,这昏迷在错误的报道。我们需要:

AND ANR.RegionId IN (@p1, @p2) 

if部分

session.CreateSQLQuery(
    @"SELECT DISTINCT PT.PermissionType FROM AspNetUsers AU 
    INNER JOIN AspNetUserRoles AR ON AU.Id= AR.UserId 
    INNER JOIN dbo.AspNetRoles ANR ON ANR.Id = AR.RoleId 
    INNER JOIN [dbo].[tbl_RolePermissionTypeAssoc] RPT 
      ON RPT.FK_RoleId = AR.RoleId 
    INNER JOIN tbl_PermissionType PT ON RPT.FK_permissionTypeId=PT.Id 
    // this is wrong 
    // WHERE AU.ID=:userId AND ANR.RegionId=:regionId 
    // we need IN 
    WHERE AU.ID=:userId AND ANR.RegionId IN (:regionId) 
    ") 
    .SetParameter("userId", userId) 
    .SetParameterList("regionId", regionIds); 

以及在其他部分,我们使用的是未经过

else部分PARAMS:

session.CreateSQLQuery(
    @"SELECT DISTINCT PT.PermissionType FROM AspNetUsers AU 
    INNER JOIN AspNetUserRoles AR ON AU.Id= AR.UserId 
    INNER JOIN dbo.AspNetRoles ANR ON ANR.Id = AR.RoleId 
    INNER JOIN [dbo].[tbl_RolePermissionTypeAssoc] RPT ON RPT.FK_RoleId = AR.RoleId 
    INNER JOIN tbl_PermissionType PT ON RPT.FK_permissionTypeId=PT.Id 

    -- here is again RegionId, but that is not passed 
    WHERE AU.ID=:userId AND ANR.RegionId=:regionId") 
    .SetParameter("userId", userId); 

RegionId预期再次但未通过

+0

傻我,它的工作 –

+1

很高兴看到这一点。享受强大的NHibernate;) –