实体框架ObjectQuery按日期顺序排列多对多关系

时间:2011-07-22 08:59:04

标签: entity-framework-4 linq-to-entities

我有一个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

有什么想法吗?

更新

在阅读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();

没有任何错误,但是将接缝分类不起作用。

使用Entity 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.

所以我想我已经尽力了......

1 个答案:

答案 0 :(得分: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();
相关问题