fur*_*ier 4 c# nhibernate queryover
休斯顿,我们有一个问题...不,我猜只是我一个。:)
我正在尝试对NHibernate QueryOver对象进行子查询。没有子查询的查询可以正常工作,但是添加子查询后,一切都会崩溃。
EDIT1:
我要完成的工作是选择与容器的所有关系的AccountStatus属性设置为DELETED的所有用户
var queryOver = session.QueryOver<User>();
queryOver.WhereRestrictionOn(x => x.UserHasContainer).IsNotEmpty
.JoinQueryOver<ContainerUser>(x => x.UserHasContainer)
.WithSubquery.WhereAll(x => x.AccountStatus == AccountStatus.DELETED);
Run Code Online (Sandbox Code Playgroud)
不断收到此异常:
System.Exception: right operand should be detachedQueryInstance.As<T>() - "DELETED"
at NHibernate.Impl.ExpressionProcessor.FindDetachedCriteria(Expression expression)
at NHibernate.Impl.ExpressionProcessor.ProcessSubqueryExpression(LambdaSubqueryType subqueryType, BinaryExpression be)
at NHibernate.Impl.ExpressionProcessor.ProcessSubquery[T](LambdaSubqueryType subqueryType, Expression`1 expression)
at NHibernate.Criterion.Subqueries.WhereAll[T](Expression`1 expression)
at RBAC.Infrastructure.DataAccess.QueryObject.Implementation.UserQueryObject.FilterByContainerRelationsAreScheduledForDeletion(IQueryOver`2 queryOver) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Implementation\UserQueryObject.cs:line 113
at RBAC.Infrastructure.DataAccess.QueryObject.Implementation.UserQueryObject._ExecuteQuery(IQueryOver`2 queryOver) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Implementation\UserQueryObject.cs:line 101
at RBAC.Infrastructure.DataAccess.QueryObject.Base.BaseQueryObject`1.ExecuteQuery(ISessionDecorater session) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Base\BaseQueryObject.cs:line 20
at RBAC.Infrastructure.DataAccess.GenericDAO.Implementation.GenericDAO.GetByQueryObject[T](IQueryObject`1 queryObject) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\GenericDAO\Implementation\GenericDAO.cs:line 253
at RBAC.Infrastructure.BusinessService.CleanupModule.Implementation.RBACCleanerActions.CleanUpUsers() in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\BusinessService\CleanupModule\Implementation\RBACCleanerActions.cs:line 59
Run Code Online (Sandbox Code Playgroud)
我已经用谷歌搜索了正确的操作数应该是detachedQueryInstance和其他查询,也没有运气。希望这里的人知道哪里出了问题,以及将来如何解决这些问题。
我也没有运气尝试过此查询:
queryOver.WhereRestrictionOn(x => x.UserHasContainer).IsNotEmpty
.JoinQueryOver<ContainerUser>(x => x.UserHasContainer)
.Where(Subqueries.WhereAll<ContainerUser>(x => x.AccountStatus == AccountStatus.DELETED));
Run Code Online (Sandbox Code Playgroud)
例外:
System.InvalidCastException: Unable to cast object of type 'System.Linq.Expressions.PropertyExpression' to type 'System.Linq.Expressions.BinaryExpression'.
at NHibernate.Impl.ExpressionProcessor.ProcessSubquery[T](LambdaSubqueryType subqueryType, Expression`1 expression)
at NHibernate.Criterion.Subqueries.WhereAll[T](Expression`1 expression)
at RBAC.Infrastructure.DataAccess.QueryObject.Implementation.UserQueryObject.FilterByUsersWereAllTheirFunctionRelationsAreScheduledForDeletion(IQueryOver`2 queryOver) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Implementation\UserQueryObject.cs:line 157
at RBAC.Infrastructure.DataAccess.QueryObject.Implementation.UserQueryObject._ExecuteQuery(IQueryOver`2 queryOver) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Implementation\UserQueryObject.cs:line 97
at RBAC.Infrastructure.DataAccess.QueryObject.Base.BaseQueryObject`1.ExecuteQuery(ISessionDecorater session) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\QueryObject\Base\BaseQueryObject.cs:line 21
at RBAC.Infrastructure.DataAccess.GenericDAO.Implementation.GenericDAO.GetByQueryObject[T](IQueryObject`1 queryObject) in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\DataAccess\GenericDAO\Implementation\GenericDAO.cs:line 253
at RBAC.Infrastructure.BusinessService.ADModule.Implementation.DeletionFlagSetter.FlagUsersForDeletionWereAllRelationsAreFlaggedForDeletionForADRegisteredUsers() in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\BusinessService\ADModule\Implementation\DeletionFlagSetter.cs:line 115
at RBAC.Infrastructure.BusinessService.ADModule.Implementation.ActiveDirectorySynchronizer.Synchronize() in c:\APPL\dev\RBAC\Dev\RBAC.Infrastructure\BusinessService\ADModule\Implementation\ActiveDirectorySynchronizer.cs:line 156
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我认为如果我有用户列表,则linq中的等效项将是这个。
users.Where(x => x.UserHasFunctions.All(y => y.IsDeleted)).ToList();
Run Code Online (Sandbox Code Playgroud)
在尝试通过QueryOver查询时,我通常采取的第一步是提出正确的SQL。根据您的LINQ查询,我认为这看起来像这样:
select
User.*
from
User
where
/* Or whatever "deleted" turns out to be, not necessarily '1' */
1 = all (select AccountStatus
from ContainerUser
where ContainerUser.UserId = User.Id);
Run Code Online (Sandbox Code Playgroud)
基本上将所有用户所在ContainerUser
行都具有AccountStatus
删除的所有用户。
因此,在QueryOver中,您可以编写如下内容:
User userAlias = null;
session.QueryOver<User>(() => userAlias)
.WithSubquery.WhereValue(AccountStatus.DELETED).EqAll(QueryOver.Of<ContainerUser>()
.Where(uc => uc.User.Id == userAlias.Id)
.Select(uc => uc.AccountStatus));
// select list, more restrictions, etc.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2850 次 |
最近记录: |