Entity Framework ObjectQuery упорядочен по дате по отношению ко многим ко многим - PullRequest
1 голос
/ 22 июля 2011

У меня есть 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 Ответ

3 голосов
/ 22 июля 2011

А как вы ожидаете, что это должно работать?У вас есть машины, и у каждой из них может быть много гонок, поэтому вы не можете сортировать машины по данным гонки, если вы не выполните одно из следующих действий:

  • Сортировка автомобилей с некоторой агрегацией гонок - например, .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();
...