2008-09-13 42 views
6

Tôi gặp sự cố khi đặt hàng nhiều hơn một trường trong truy vấn LINQ tới NHibernate của tôi. Có ai biết điều gì có thể sai hoặc nếu có một công việc xung quanh?LINQ to NHibernate nhiều OrderBy gọi

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

Tôi đã thử thay thế ThenBy với nhiều cuộc gọi OrderBy. Cùng một kết quả. Phương pháp này hoạt động tuyệt vời nếu tôi nhận xét hai cuộc gọi ThenBy.

Lỗi Tôi nhận:

 
    [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 

Trả lời

7

Điều này trông giống như một lỗi với LINQ đối với NHybernate. Một cách giải quyết có thể là chuyển đổi thành mảng trước khi sắp xếp. Một nhược điểm lớn tiềm ẩn là bạn không thể giới hạn kết quả bằng cách sử dụng Skip() và Take() trước khi liệt kê, vì vậy điều này có thể không đủ cho bạn.

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

mặc dù tôi không nghĩ rằng nó sẽ tạo sự khác biệt, những gì sẽ xảy ra nếu bạn làm LINQ của bạn như thế này:

(từ i trong mục orderby i. prop1, i.prop2, i.prop3) .Skip (...) Lấy (...). ToArray();

+0

Đúng, đã thử và kết thúc được phân tích cú pháp giống nhau và đưa ra cùng một lỗi. – Rob