Что не поддерживается в этом запросе NHibernate 5? - PullRequest
0 голосов
/ 06 августа 2020

Я обновляю NHibernate с 4 до 5 для приложения Asp. Net и получаю одну ошибку:

'query.ToList()' threw an exception of type 'System.NotSupportedException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233067
    HelpLink: null
    InnerException: null
    Message: "query ( query ( select_from ( from ( range ( . _0 RolePrivileges ) a ) ) ( select a ) ) ( where ( and ( == ( . a AccessTypeName ) ( : p12 ) ) ( or ( == ( : p13 ) true ) ( == ( . ( . param002 Role ) Id ) ( : p14 ) ) ) ) ) )"
    Source: "NHibernate"
    StackTrace: "   at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)\r\n   at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)\r\n   at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()\r\n   at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)\r\n   at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)\r\n   at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)\r\n   at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)\r\n   at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query)\r\n   at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)\r\n   at NHib
ernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)\r\n   at Remotion.Linq.QueryableBase`1.GetEnumerator()\r\n   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)"

вышеуказанный запрос представляет собой IQueryable с цепочкой Where ( Выражение >) применил. У меня вопрос, что именно не поддерживается в NHibernate 5 в моем случае? Он отлично работает с NHibernate 4.

Полный запрос строится в длинных цепочках вызовов функций, в которых к запросу добавляется много Where (), я могу идентифицировать неудачное место:

var predicateReadPrivilege = PredicateBuilder.Create<Resource>(x =>
                x.RType.RolePrivileges.Where(a => a.AccessTypeName == accessLevel).AsQueryable().Where(_ => true).Any());// _predicatePrivilegeOnResourceType).Any());

в приведенном выше коде, это проблема AsQueryable () (как вы можете видеть, даже если это избыточный критерий), если я удалю его, это не вызовет исключения.

enter code here

Ответы [ 2 ]

0 голосов
/ 16 августа 2020

Я задал тот же вопрос в NHibernate (https://github.com/nhibernate/nhibernate-core/issues/2471), и это подтверждено как ошибка, обходной путь - переместить AsQueryable из пункта «Где» в сопоставленную коллекцию, т. Е. Новый код после обходной путь:

var predicateReadPrivilege = PredicateBuilder.Create<Resource>(x =>
                x.RType.RolePrivileges.AsQueryable().Where(a => a.AccessTypeName == accessLevel).Where(_predicatePrivilegeOnResourceType).Any());
0 голосов
/ 09 августа 2020

Список поддерживаемых запросов linq можно найти в документации NHibernate в главе 18.3. Поддерживаемые методы и члены

Например, операции DateTime (AddDays, AddYears, ...) НЕ поддерживаются, мне нужно создать собственную реализацию, чтобы она работала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...