Я пытаюсь упорядочить свою основную таблицу (Контракт) по некоторому значению в другой таблице (через Соединение), затем снова уменьшить его до Контрактов и отсортировать его (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 функциям.