2011-11-04 54 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