2015-11-24 58 views
2

我有以下方法:LINQ的ThenBy()拋出「爲最佳重載方法匹配ThenBy()有一些無效參數」異常

public List<LambdaExpression> defaultSortExpressions { get; set; } 

private IQueryable<TEntity> orderEntries(IQueryable<TEntity> entries) 
{ 
    var n = 0; 
    foreach (var sortExpression in defaultSortExpressions) 
    { 
     if (n == 0) 
     { 
      entries = Queryable.OrderBy(entries, (dynamic)sortExpression); 
     } 
     else 
     { 
      entries = Queryable.ThenBy(entries, (dynamic)sortExpression); 
     } 
     n = n + 1; 
    } 
    return entries; 
} 

在執行TheyBy()線,我得到下面的異常:

「關於 'System.Linq.Queryable.ThenBy(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>)' 最好的重載的方法匹配具有一些無效參數」}
System.Exception的{ Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

爲什麼這不起作用?

回答

4

entries在編譯時被強制轉換爲IQueryable<TEntity>,而ThenBy需要IOrderedQueryable<TEntity>。在將其傳遞到ThenBy()之前,您可以嘗試將entries作爲dynamic。或者您可以在正確類型的單獨變量中將調用結果捕獲到OrderBy以調用ThenBy

private IQueryable<TEntity> orderEntries(IQueryable<TEntity> entries) 
{ 
    if(defaultSortExpressions.Count == 0) 
     return entries;   
    IOrderedQueryable<TEntity> ordered = Queryable.OrderBy(entries, (dynamic) defaultSortExpressions[0]); 

    foreach (var sortExpression in defaultSortExpressions.Skip(1)) 
    { 
     ordered = Queryable.ThenBy(ordered, (dynamic)sortExpression);    
    } 
    return ordered; 
} 
+1

我認爲你的意思是'== 0'而不是'<0'。 '清單 .Count'永遠不會返回負數,但如果列表爲空,則代碼當前會中斷。 –

+0

謝謝!給出的示例代碼和將'entries'轉換爲'dynamic'都可以工作。 – im1dermike

+0

@ im1dermike:Jon在回答中還指出,他刪除了可以將它轉換爲IOrderedQueryable 而不是動態的。我更願意儘可能減少「動態」的使用。 – StriplingWarrior

相關問題