sqlquery query linq nhibernate linq-to-nhibernate

linq - sqlquery - nhibernate sql query string



Linq a NHibernate mĂșltiples llamadas a OrderBy (2)

Tengo problemas para realizar pedidos por más de un campo en mi consulta de Linq a NHibernate. ¿Alguien sabe qué podría estar mal o si hay una solución alternativa?

Código:

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

He intentado reemplazar ThenBy con varias llamadas OrderBy. Mismo resultado. El método funciona muy bien si hago un comentario sobre las dos llamadas a continuación.

Error que estoy recibiendo:

[SqlException (0x80131904): Invalid column name ''__hibernate_sort_expr_0____hibernate_sort_expr_1__''. Invalid column name ''__hibernate_sort_expr_0____hibernate_sort_expr_1__''.] System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1948826 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, 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: could not execute query [ 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 Minutes5_2_, agenda1_.Id as Id2_0_, agenda1_.LocationId as LocationId2_0_, agenda1_.Date as Date2_0_, location2_.Id as Id7_1_, location2_.Name as Name7_1_ FROM AgendaItem this_ left outer join Agenda agenda1_ on this_.AgendaId=agenda1_.Id left outer join Location location2_ on agenda1_.LocationId=location2_.Id WHERE location2_.Id = ? and (this_.Minutes like ? or this_.Description like ?) ORDER BY agenda1_.Date asc, this_.OutcomeType asc, this_.OutcomeNumber asc ] Positional parameters: #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 as Minutes5_2_, agenda1_.Id as Id2_0_, agenda1_.LocationId as LocationId2_0_, agenda1_.Date as Date2_0_, location2_.Id as Id7_1_, location2_.Name as Name7_1_ FROM AgendaItem this_ left outer join Agenda agenda1_ on this_.AgendaId=agenda1_.Id left outer join Location location2_ on agenda1_.LocationId=location2_.Id WHERE location2_.Id = ? and (this_.Minutes like ? or this_.Description like ?) ORDER BY agenda1_.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 criteria, IList results) +342 NHibernate.Impl.CriteriaImpl.List(IList results) +41 NHibernate.Impl.CriteriaImpl.List() +35 NHibernate.Linq.CriteriaResultReader`1.List() in C:/home/dev/tools/NHibernate/NHibernateContribSrc/src/NHibernate.Linq/src/NHibernate.Linq/CriteriaResultReader.cs:22 NHibernate.Linq.d__0.MoveNext() in C:/home/dev/tools/NHibernate/NHibernateContribSrc/src/NHibernate.Linq/src/NHibernate.Linq/CriteriaResultReader.cs:27


aunque no creo que marque la diferencia, ¿qué pasa si haces tu linq así:

(desde i en elementos ordenados por i.prop1, i.prop2, i.prop3) .Skip (...). Take (...). ToArray ();


Esto me parece un error con Linq a NHybernate. Una solución posible es convertir a una matriz antes de ordenar. Una desventaja potencialmente grande es que no puede limitar los resultados utilizando Skip () y Take () antes de enumerar, por lo que esto puede no ser suficiente para usted.

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