我想在另一个表中的一些值为了我的主表(合同)失败后(通过加入),然后再次减少合同和排序它(ThenBy)。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();
}
当条件是假的,一切都可以作为例外。 然而,当更复杂的排序依据()执行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( )失败。是否有可能通过另一个表中的某些东西进行排序,然后将结果减少到Contract并ThenBy-对它重新排序?
一些评论:
- 如果这是给您的任何帮助:在我的生产代码,我有一个通用的排序类大多来自this answer拍摄。
- 是的,我知道的例子很容易被固定,但在我的生产代码,我需要通过用户定义的值排序一个通用的解决方案。这将循环并将Queryable传递给函数。
订购我想过这个问题,但'的OrderBy(J =>的Jc)'不作为的Jc工作是指缩合至极是一个没有比较器的类。而使用另一个OrderBy将否定以前的所有。 – void
@NULL我以你的方式订购。 –
你解决了我的例子的问题,不幸的是在我的真实代码中,我必须通过我的半完成查询来进一步实现排序/过滤,与另一个表连接,为分页准备数据等。 – void