Как это сделать в nhibernate? - PullRequest
       37

Как это сделать в nhibernate?

2 голосов
/ 23 февраля 2011

Мне нужно сделать это в 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))

, но при этом выбираются все (выберите ), и я хочутолько объект Command (выберите sc. ).Если я попытаюсь добавить проекцию к запросу следующим образом:

queryOverRole.Select(x=>x);

, он выдаст это исключение:

System.Exception was caught   Message=Could not determine member

из x Source = NHibernate
StackTrace: atNHibernate.Impl.ExpressionProcessor.FindMemberExpression (выражение-выражение) в d: \ CSharp \ NH \ nhibernate \ src \ NHibernate \ Impl \ ExpressionProcessor.cs: строка 189 в проекциях NHibernate.Criterion.QueryOver 2.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: \ Projects \ EGrad \ Main \ Source \ SourceNovatec.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 Ответ

1 голос
/ 17 апреля 2011

Попробуйте это .... вам нужно указать, какой псевдоним выбрать. queryOverRole.Select (result => cmdAlias);

...