NHibernate OrderByDescending 抛出异常`发生识别错误`
NHibernate OrderByDescending throwing exception `A recognition error occurred`
使用时:
.OrderByDescending(review => review.Country.Id == reviewCountryID)
正确生成了 SQL 查询,没有抛出任何错误。
使用时:
.OrderByDescending(review =>
review.User != null &&
review.User.Country != null &&
review.User.Country.Id == userCountryID
)
抛出异常:
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException
A recognition error occurred.
at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
关于如何解决此问题或替代方案的任何建议?
谢谢!
更新
更新了 OrderBy 以实际包含空值检查。
在 Select()
中投影表达式 review.User != null && review.User.Country != null && review.User.Country.Id == 144
按预期工作,但 OrderBy 中的相同条件抛出异常。
更新
以下修复了多个连接的问题但在对它们执行布尔条件时没有解决问题:
使用投影 属性 执行 OrderByDescending,然后仅投影回实体查询,例如:
.Select(review => new
{
Review = review,
ReviewUserCountryId = (review.User != null && review.User.Country != null) ? review.User.Country.Id : (int?)null
})
.OrderByDescending(review => ReviewUserCountryId)
.Select(reviewInfo => reviewInfo.Review) // for aliasing assuming that ReviewUserCountryId won't be needed later in the query
// rest of query
NHibernate 似乎拒绝对布尔值进行排序。
一种解决方案是在OrderBy中对整数进行投影排序,例如:
.OrderByDescending(review => (review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID) ? 42 : -42);
如果有更好的解决方案欢迎补充
使用时:
.OrderByDescending(review => review.Country.Id == reviewCountryID)
正确生成了 SQL 查询,没有抛出任何错误。
使用时:
.OrderByDescending(review =>
review.User != null &&
review.User.Country != null &&
review.User.Country.Id == userCountryID
)
抛出异常:
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException
A recognition error occurred.
at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
关于如何解决此问题或替代方案的任何建议?
谢谢!
更新
更新了 OrderBy 以实际包含空值检查。
在 Select()
中投影表达式 review.User != null && review.User.Country != null && review.User.Country.Id == 144
按预期工作,但 OrderBy 中的相同条件抛出异常。
更新
以下修复了多个连接的问题但在对它们执行布尔条件时没有解决问题:
使用投影 属性 执行 OrderByDescending,然后仅投影回实体查询,例如:
.Select(review => new
{
Review = review,
ReviewUserCountryId = (review.User != null && review.User.Country != null) ? review.User.Country.Id : (int?)null
})
.OrderByDescending(review => ReviewUserCountryId)
.Select(reviewInfo => reviewInfo.Review) // for aliasing assuming that ReviewUserCountryId won't be needed later in the query
// rest of query
NHibernate 似乎拒绝对布尔值进行排序。
一种解决方案是在OrderBy中对整数进行投影排序,例如:
.OrderByDescending(review => (review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID) ? 42 : -42);
如果有更好的解决方案欢迎补充