NHibernate orderbydescent抛出异常'发生识别错误'

本文关键字:识别 错误 NHibernate orderbydescent 抛出异常 | 更新日期: 2023-09-27 18:07:52

使用时:

.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)

有什么建议如何解决这个问题或替代方案吗?

谢谢!

更新order以实际包含空检查。

Select()中投影表达式review.User != null && review.User.Country != null && review.User.Country.Id == 144可以正常工作,但是在OrderBy中相同的条件抛出异常。

下面修复了多个连接的问题,但不包括对它们执行布尔条件的问题:

使用投影属性执行orderbydescent,然后只投影查询的实体,例如:

.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 orderbydescent抛出异常'发生识别错误'

对于多个连接,NHibernate似乎拒绝对布尔值排序。

一种解决方法是对order中整数的投影进行排序,例如:

.OrderByDescending(review => (review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID) ? 42 : -42);

如果有更好的解决方案请添加