2011-07-22 178 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