2011-07-22 88 views
1

我有一個ObjectQuery這樣的:實體框架的ObjectQuery按日期對多對多關係

ObjectQuery<Car> query = GetCarQuery(); 

比我想的財產Date對相關實體Race,服用點訂購像

query = (ObjectQuery<Car>)query.OrderBy(x=> x.Races.Date); 
query.Skip((page - 1) * rows).Take(rows).ToList(); 

試圖這樣去做:

query = (ObjectQuery<Car>)query.OrderBy(i => i.Races.OrderBy(x=> x.Date)); 
query.Skip((page - 1) * rows).Take(rows).ToList(); //error here 

並執行查詢時出錯

DbSortClause expressions must have a type that is order comparable. 
Parameter name: key 

任何想法?

UPDATE:

閱讀之後http://blogs.msdn.com/b/alexj/archive/2009/02/25/tip-1-sorting-relationships-in-entity-framework.aspx我是這樣的:

var result = (from a in query 
         select new 
       { 
        Car= a, 
        Race= a.Races.OrderBy(x => x.Date) 
       }).Skip((page - 1) * rows).Take(rows).ToList(); 

沒有得到任何錯誤,但排序接縫不工作。

一個嘗試,但與實體SQL:

query = query.OrderBy("it.Races.Date"); 
query = query.Skip((page - 1) * rows).Take(rows).ToList();//error here 

,並收到錯誤:

'Date' is not a member of 'Transient.collection[Race(Nullable=True,DefaultValue=)]'. To extract a property of a collection element, use a subquery to iterate over the collection. Near simple identifier, line 6, column 28. 

因此,我認爲我已經嘗試了所有我能......

回答

3

又如何你期望它應該工作?你有車,他們每個人都可以有許多種族所以,除非你做任何你不能比賽的數據汽車進行排序:

  • 排序汽車行駛種族的一些彙總 - 例如.OrderBy(x=> x.Races.Max(Date))
  • 拼合結果有新記錄每個種族(汽車的重複)

對於第二個解決方案,您可以嘗試類似:

var result = (from car in query 
       from race in car.Races 
       select new 
       { 
        Car = car, 
        Race = race 
       }) 
       .OrderBy(x => x.Race.Data) 
       .Skip((page - 1) * rows) 
       .Take(rows).ToList(); 
+1

使用SQL事件探查,檢查產生何種查詢。也許它不像我預期的那樣工作。 –

+0

完成,是我的錯。 '.OrderByDescending()'做這件事,但看起來像是無所謂我使用'Min()'或'Max()'出於某種原因? – Joper

+0

我想我知道爲什麼,因爲這個'Min()'或'Max()'包裝在'.OrderBy()'或者'.OrderByDescending()'中,所以對於這個查詢,它會按照這個順序排序?我對嗎?。 – Joper