2008-09-13 2 views
6

NHibernate 쿼리에 대해 Linq에서 둘 이상의 필드로 주문하는 데 문제가 있습니다. 누구도 잘못되었거나 해결 방법이 있는지 알 수 있습니까?Linq가 여러 OrderBy 호출을 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 호출을 주석 처리하면 멋지게 작동합니다.

를 (전에서 항목 난을 ORDERBY에 :

오류 내가받은거야 : 나는 그것이 차이를 만들 거라고 생각 해달라고하지만이처럼 LINQ를 할 경우

 
    [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 

답변

7

이것은 Linq가 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) 
0

, 어떤 일이 발생합니다. prop1, i.prop2, i.prop3) .Skip (...). Take (...) .ToArray();

+0

그래, 시도해 보니 동일한 구문 분석이 끝나고 동일한 오류가 발생합니다. – Rob

관련 문제