C# NHibernate OrderByDescending引发异常`发生识别错误`

C# NHibernate OrderByDescending引发异常`发生识别错误`,c#,nhibernate,linq-to-nhibernate,C#,Nhibernate,Linq To Nhibernate,使用时: .OrderByDescending(review => review.Country.Id == reviewCountryID) .OrderByDescending(review => review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID ) SQL查询已正确生成,不会引发任何

使用时:

.OrderByDescending(review => review.Country.Id == reviewCountryID)
.OrderByDescending(review =>
    review.User != null &&
    review.User.Country != null &&
    review.User.Country.Id == userCountryID
)
SQL查询已正确生成,不会引发任何错误

使用时:

.OrderByDescending(review => review.Country.Id == reviewCountryID)
.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中的相同条件会引发异常

更新

下面修复了多个联接的问题,但在对它们执行布尔条件时没有,这正是问题所要求的:

使用projected属性执行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
.OrderByDescending(review => (review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID) ? 42 : -42);

似乎对于多重连接,NHibernate拒绝对布尔型进行排序

解决方案是根据OrderBy中整数的投影进行排序,例如:

.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
.OrderByDescending(review => (review.User != null && review.User.Country != null && review.User.Country.Id == userCountryID) ? 42 : -42);

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

您在orderBy中放置布尔条件的目的是什么,布尔条件是否应该放在where子句中,并且orderBy应该只放在您要排序的属性上??Order by应该是
.OrderByDescending(review=>review.Country.Id)
将其他检查移动到哪里clause@entre:我不需要按条件筛选,我只需要按条件为真的降序排序。使用
42
始终是首选方法。