Затем происходит сбой после выбора - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь упорядочить свою основную таблицу (Контракт) по некоторому значению в другой таблице (через Соединение), затем снова уменьшить его до Контрактов и отсортировать его (ThenBy) по значению в Контракте.

Воткороткая версия моего вопроса:
Можно ли уменьшить составной анонимный тип (созданный объединением) до определенного типа, не превращая мой IOrderedQueryable в IQueryable?

Длинная версия вопроса с примером:

Мой производственный код довольно сложный, но для целей этого вопроса я разбил его на простой пример:

static void simple()
{
  bool condition = true;

  var ctx = new LxDataContext();

  IQueryable<Contract> q1 = ctx.Contracts.Join(ctx.ContractDetails, c => c.ContractId, cd => cd.ContractId, (c, cd) => new { c, cd }).
                            Where(J => J.cd.DetailNo > 0).
                            Select(J => J.c);

  IOrderedQueryable<Contract> qOrdered;

  if (condition)
  {
    qOrdered = (IOrderedQueryable<Contract>)q1.Join(ctx.ContractPartners, c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }).
               Join(ctx.VwPartners, J => J.cp.PartnerId, p => p.PartnerId, (J, p) => new { J.c, p }).
               OrderBy(J => J.p.LastName).
               Select(J => J.c);
  }
  else
    qOrdered = q1.OrderBy(c => c.Premium);

  IOrderedQueryable<Contract> qReady = (qOrdered).ThenBy(c => c.ContractId); //if condition == true exception here

  var dump = qReady.Skip(50).Take(50).ToList();
}

Когда условиеfalse все работает как исключено.Однако, когда более сложный OrderBy () выполняется, ThenBy () завершается с этим исключением:

Expression of type 'System.Linq.IQueryable`1[InfoServiceTests.DB.Contract]' cannot be used for parameter of type 'System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract]' of method 'System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract] ThenBy[Contract,Int32](System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract], System.Linq.Expressions.Expression`1[System.Func`2[InfoServiceTests.DB.Contract,System.Int32]])'

Так что, даже если я приведу его к IOrderedQueryable <> qOrdered, похоже, не IOrderedQueryable <> и ThenBy() не удается.Можно ли что-то отсортировать в другой таблице, затем уменьшить результат до Контракта, а затем снова отсортировать его?

Некоторые комментарии:
- Если это поможет вам: в моем производственном коде у меня есть общий класс сортировки, в основном взятый из этого ответа .
- Да, я знаю, что пример можно легко исправить,но в моем производственном коде мне нужно универсальное решение для сортировки по пользовательским значениям.Это включает зацикливание и передачу Queryables функциям.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Измените код в вашем if на:

qOrdered = (IOrderedQueryable<Contract>)q1.Join(ctx.ContractPartners, c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }).
               Join(ctx.VwPartners, J => J.cp.PartnerId, p => p.PartnerId, (J, p) => new { J.c, p }).
               Select(J => J.c).
               OrderBy(J => J.p.LastName)

Это вернет IOrderedQueryable. Если Select добавить конец, вы получите обычный IQueryable, который нельзя заказать с помощью ThenBy

0 голосов
/ 04 ноября 2011

Когда Условие в порядке, вы должны добавить некоторые порядок, потому что после выбора ваш запрос не является заказанным запросом, а ThenBy просто работает после упорядоченного запроса:

Выполняет последующее упорядочение элементов в последовательности в по возрастанию.

например, в вашем истинном состоянии вы можете сделать (в вашем условии if):

qOrdered = (IOrderedQueryable<Contract>)q1
           .Join(ctx.ContractPartners, 
            c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }).
            Join(ctx.VwPartners, J => J.cp.PartnerId, 
                 p => p.PartnerId, (J, p) => new { J.c, p }).
               OrderBy(J => J.p.LastName).ThenBy(J=>J.ContractId)
               Select(J => J.c);

и вы можете сделать (в своем операторе else):

qOrdered = q1.OrderBy(c => c.Premium).ThenBy(c=>c.ContractId);

Также вам следует удалить текущую операцию ThenBy после ваших операторов if.

На самом деле вы должны найти что-то, что можно заказать, и заказать его, а затем использовать затем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...