2011-11-04 52 views
1

我想在另一个表中的一些值为了我的主表(合同)失败后(通过加入),然后再次减少合同和排序它(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传递给函数。

回答

0

当条件是OK,你应该添加一些排序becausae选择查询后没有下令查询和ThenBy只是工作订购之后查询:

执行在一个序列中元素的 升序后续排序。

例如在你的真实情况,你可以做(​​在你的,如果条件):

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); 

你也应该在if语句后删除当前的ThenBy操作。

其实你应该找到一些东西,可订购和排序依据,然后使用ThenBy。

+0

订购我想过这个问题,但'的OrderBy(J =>的Jc)'不作为的Jc工作是指缩合至极是一个没有比较器的类。而使用另一个OrderBy将否定以前的所有。 – void

+0

@NULL我以你的方式订购。 –

+0

你解决了我的例子的问题,不幸的是在我的真实代码中,我必须通过我的半完成查询来进一步实现排序/过滤,与另一个表连接,为分页准备数据等。 – void

0

你如果更改代码:

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。如果选择的是添加结束时,你会得到一个正常的IQueryable不能与ThenBy

+0

之后,选择J.p不再可用,我可以将它包含在select中,但是然后我就是对的,我开始了。 – void