Как это сделать в nhibernate?
Мне нужно сделать это в nhibernate QueryOver:
select distinct sc.* from [Security].[Commands] sc
inner join [Security].[SystemSubjects] ss on ss.Id = sc.Id
left outer join [Security].[SystemSubjectRoles] ssr on ssr.SystemSubjectId = ss.Id
left outer join [Security].[Roles] sr on sr.Id = ssr.RoleId
left outer join [Security].[UserRoles] ur on ur.IdRole = sr.Id
left outer join [Security].[User] su2 on su2.Id = ur.IdUser
left outer join [Security].SystemSubjectUsers ssu on ssu.SystemSubjectId = ss.Id
left outer join [Security].[User] su on su.Id = ssu.UserId
where (su2.Id = 1 or su.Id = 1)
Пока я сделал это:
var queryOverRoles = QueryOver.Of<Command>(() => cmdAlias)
.JoinAlias(() => cmdAlias.SystemSubjectRoles, () => ssRoleAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => ssRoleAlias.Role, () => roleAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => roleAlias.Users, () => userAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => cmdAlias.SystemSubjectUsers, () => ssUserAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => ssUserAlias.User, () => userAlias2, JoinType.LeftOuterJoin)
.TransformUsing(Transformers.DistinctRootEntity)
.Where(() => ssRoleAlias.SecurityPermission == SecurityPermission.Allow)
.And(() => (userAlias.Id == userId || userAlias2.Id == userId))
но при этом выбираются все (Select ) и мне нужен только объект Command (выберите sc.). Если я попытаюсь добавить проекцию к запросу следующим образом:
queryOverRole.Select(x=>x);
это бросает это исключение:
System.Exception was caught Message=Could not determine member
из источника x = NHibernate
StackTrace: at NHibernate.Impl.ExpressionProcessor.FindMemberExpression (выражение-выражение) в d: \ CSharp \ NH \ nhibernate \ src \ NHibernate \ Impl \ ExpressionProcessor.cs: строка 189 в NHibernate.Criterion.QueryOver2.Select(Expression
1 [] проекции) в d:\CSharp\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs: строка 363 в Novatec.Persistence.Repositories.Implementations.UserRepository.GetAllowedUserCommands(Int32 userId) в C:\Projects\EGrad\Main\Source\Novatec.E-Grad\Source\Novatec.Persistence\Repositories\Implementations\UserRepository.cs: строка 140 в Novatec.Administracija.Services.Security.SecurityManager.AuthorizeUserAction(Int32 userId, String commandId) в C: \ Проекты \EGrad\Main\Source\Novatec.E-Grad\Source\Novatec.Administracija.Services\Security\SecurityManager.cs: строка 48 в Novatec.Framework.Infrastructure.Services.ServiceBase.ExecuteCommand(Int32 userId, String appId, ICommand команда) в C:\Projects\EGrad\Main\Source\Novatec.E-Grad\Source\Novatec.Framework.Infrastructure\Services\ServiceBase.cs: строка 94 InnerException:
1 ответ
Попробуйте это.... вам нужно указать, какой псевдоним выбрать. queryOverRole.Select(result => cmdAlias);