2017-03-03 80 views
1

我有一些函數(X)返回IQueryable與「OrderBy(x => x.Name)」。 我想在新代碼中使用X函數,但在此代碼中有確定順序(asc/desc)的參數。如何更改IQueryable的OrderBy方向

我不想改變(X),因爲它已經在多個地方使用了。

有選擇獲得X(),然後取消它的「OrderBy」,並應用新的訂單?

(現在它拋出異常,因爲它是像Y.OrderBy(A => a.Name).OrderByDescending(A => a.Name))

「A列已被指定多次在更按列表排序按列表排序中的列必須是唯一的。\ r \ n無法準備陳述。「

+2

我覺得你需要寫兩個分支,一個orderby下一個orderby下降。我希望我知道一個更優雅的解決方案.. – TaW

+0

你在最後一種情況下會得到什麼例外?這應該是次優的,但仍然適用於AFAICT。 –

+0

@JonHanna例外情況是'「按列表順序指定了多個列,按順序列表中的列必須是唯一的。\ r \ n無法準備好陳述。」 – arielorvits

回答

1

使用

public void x(string order = string.empty) 
{ 
    Y.OrderBy(a => a.Name); 
    if (order == "desc") 
    { 
    Y = Y.Reverse(); 
    } 
} 
+0

簡單,如果它的工作,但一些查詢提供商[可能](https://msdn.microsoft.com/en-us/library/bb738550(v = vs.110))。 aspx)not [support](https://stackoverflow.com/questions/30156183/system-notsupportedexception-when-creating-a-reversed-list)它。 – Rawling

0

我試着扭動IOrderedQueryable表達的對象,你的方法真的返回(我錯了?),但至今沒有運氣,我不能看到操縱選項System.Linq.Expression或System.Linq.EnumerableQuery足以使用它而不是更改X()方法。

恕我直言,你應該選擇:

  • 創建薩姆一種利用反向()(@Eric利佐特應答)或OrderByDescending()包裝方法 - 這將是耗時少我猜想,但對於分組,過濾等,你將不得不創建全新的功能。
  • 從X()函數體中移除OrderBy(),然後修改舊代碼 - 返回無序結果將爲您提供更大的靈活性和機會,通過您在每個場景中通過linq表達式執行的結果會遇到。

對於我來說,如果你正在討論的是「函數」,那麼你的應用程序中通過ORM映射的SQL函數(例如實體框架)或者只是一個使用你的普通方法自定義提供程序返回IQueryable?