2008-09-13 15 views
6

Ich habe Probleme durch die Bestellung von mehr als einem Feld in meiner Linq zu NHibernate Abfrage. Weiß jemand, was falsch ist oder ob es eine Arbeit gibt?Linq zu NHibernate mehrere OrderBy Anrufe

Code:

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

Ich habe versucht, ThenBy mit mehreren SortiertNach Anrufe zu ersetzen. Gleiches Ergebnis. Die Methode funktioniert gut, wenn ich die beiden ThenBy-Aufrufe auskommentiere.

Fehler Ich erhalte:

 
    [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 

Antwort

7

Das sieht für mich wie ein Fehler mit Linq zu NHybernate. Eine mögliche Abhilfe besteht darin, vor dem Sortieren in ein Array zu konvertieren. Ein möglicherweise großer Nachteil besteht darin, dass Sie die Ergebnisse nicht mithilfe von Skip() und Take() vor dem Aufzählen einschränken können, sodass dies für Sie möglicherweise nicht ausreicht.

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

obwohl ich glaube nicht, es einen Unterschied machen würde, was passiert, wenn Sie Ihre Linq wie folgt tun:

(von i in den Punkten i orderby. prop1, i.prop2, i.prop3) .Skip (...). Nimm (...). ToArray();

+0

Ja, versuchte es und es endet wird geparst das gleiche und gibt den gleichen Fehler. – Rob