Linq 到 NHibernate 多个 OrderBy 调用

标签 linq nhibernate linq-to-nhibernate

我在 Linq to NHibernate 查询中按多个字段排序时遇到问题。有没有人知道可能出了什么问题,或者是否有解决方法?

代码:

IQueryable<AgendaItem> items = _agendaRepository.GetAgendaItems(location)
   .Where(item => item.Minutes.Contains(query) || item.Description.Contains(query));

int total = items.Count();

var results = items
   .OrderBy(item => item.Agenda.Date)
   .ThenBy(item => item.OutcomeType)
   .ThenBy(item => item.OutcomeNumber)
   .Skip((page - 1)*pageSize)
   .Take(pageSize)
   .ToArray();

return new SearchResult(query, total, results);

我尝试用多个 OrderBy 调用替换 ThenBy。结果一样。如果我注释掉两个 ThenBy 调用,则该方法效果很好。

我收到的错误:

[SqlException (0x80131904): 无效的列名 '__hibernate_sort_expr_0____hibernate_sort_expr_1__'。
无效的列名“__hibernate_sort_expr_0____hibernate_sort_expr_1__”。]
System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection) +1948826
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection) +4844747
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392

[ADOException: 无法执行查询
[ SELECT this_.Id as Id5_2_, this_.AgendaId as AgendaId5_2_, this_.Description as Descript3_5_2_, this_.OutcomeType as OutcomeT4_5_2_, this_.OutcomeNumber as OutcomeN5_5_2_, this_.Minutes as Minutes1_2_, Identity10_Location_Id, Id2_Location_Id_2_议程1_.日期为Date2_0_,位置2_.Id为Id7_1_,位置2_.名称为名称7_1_ FROM AgendaItem this_左外连接议程议程1_在this_.AgendaId=agenda1_.Id左外连接位置location2_ on议程1_.LocationId=location2_.Id WHERE location2_.Id = ?和(this_.Minutes like ? or this_.Description like ?)按议程1_.Date asc, this_.OutcomeType asc, this_.OutcomeNumber asc ]
位置参数:#0>1 #0>%Core% #0>%Core%
[SQL: SELECT this_.Id as Id5_2_, this_.AgendaId as AgendaId5_2_, this_.Description as Descript3_5_2_, this_.OutcomeType as OutcomeT4_5_2_, this_.OutcomeNumber as OutcomeN5_5_2_, this_.Minutes. Minutes as Minutes_Id_2_0_Idcations_Idcation_Idc_Id_2_0_Idcations_Idc LocationId2_0_,议程1_.日期为Date2_0_,位置2_.Id为Id7_1_,位置2_.名称为名称7_1_FROM AgendaItem this_左外连接议程议程1_ on this_.AgendaId=agenda1_.Id左外连接位置location2_ on议程1_.LocationId=location2_Id WE .Id = ?和(this_.Minutes like ? or this_.Description like ?)按议程1_.Date asc、this_.OutcomeType asc、this_.OutcomeNumber asc]]]
NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +258
NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +18
NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) +87
NHibernate.Impl.SessionImpl.List(CriteriaImpl 标准,IList 结果) +342
NHibernate.Impl.CriteriaImpl.List(IList 结果) +41
NHibernate.Impl.CriteriaImpl.List() +35
NHibernate.Linq.CriteriaResultReader`1.List() 在 C:\home\dev\tools\NHibernate\NHibernateContribSrc\src\NHibernate.Linq\src\NHibernate.Linq\CriteriaResultReader.cs:22
NHibernate.Linq.d__0.MoveNext() 在 C:\home\dev\tools\NHibernate\NHibernateContribSrc\src\NHibernate.Linq\src\NHibernate.Linq\CriteriaResultReader.cs:27

最佳答案

在我看来,这就像 Linq to NHybernate 的一个错误。一种可能的解决方法是在排序之前转换为数组。一个潜在的大缺点是你不能在枚举之前使用 Skip() 和 Take() 限制结果,所以这对你来说可能不够。

var results = items
   .ToArray()
   .OrderBy(item => item.Agenda.Date)
   .ThenBy(item => item.OutcomeType)
   .ThenBy(item => item.OutcomeNumber)
   .Skip((page - 1)*pageSize)
   .Take(pageSize)

关于Linq 到 NHibernate 多个 OrderBy 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60802/

相关文章:

c# - LINQ Group By 以及包含元素的列表的百分比

NHibernate 验证器性能

nhibernate - Composite Id 和 Restrictions.IdEq 或与 Linq 中的比较未按预期工作

c# - Scala 最短相当于 c# LINQ

c# - 自定义 Where 表达式

nhibernate - CQRS - 查询端

NHibernate.Linq 锁定模式

linq - NHibernate LINQ 在 Where() 子句中支持 ToLower() 吗?

linq - 将 Linq 与 WCF 结合使用

database - NHibernate 可以持久保存到平面文件而不是数据库吗?