2010-02-16 66 views
0

我寫了一個頁面,它使用Linq查詢數據庫並將生成的IQueryable綁定到數據網格。我有一個部分類,它包含額外的屬性,這些屬性根據從數據庫中引入的其他值導出它們的值。如何基於派生字段對Linq對象的gridview進行排序?

排序對實際位於數據庫中但不包含派生字段的字段正常工作。當我嘗試排序這樣一個領域,我得到一個錯誤說「成員‘Trip.Difference’沒有支持轉換爲SQL。

任何想法,如何讓這些派生的字段排序?

回答

0

問題是您綁定到IQueryable,所以每次枚舉它的時候,你要翻譯的IQueryable的LINQ表達一個SQL語句,並要回數據庫中執行它。

如果你想進行排序沒有綁定到數據庫模型的屬性,那麼你會得到提到的錯誤,因爲這些屬性只存在一旦一個對象已經從一個dat一排。

最簡單的解決方案是在將用於排序和數據綁定之前調用ToList(),以便對內存中實際可用的對象進行排序。 ToList()將您的IQueryable轉換爲IEnumerable(通過List<T>),並阻止它再次通過LINQ to SQL進入數據庫。

這通常是一個好的設計模式可供遵循 - 你想要的最後一件事是你的業務層的消費者能夠在不知不覺中對數據庫執行任意查詢,僅僅是因爲你返回IQueryable,你應該已經回到IEnumerable

0

呼叫ToEnumerable(),然後再添加排序依據:

var q = (from a in mDataContext.Somethings() 
     select a).ToEnumerable().OrderBy... 
+0

會調用.ToEnumerable使得從數據庫讀取的對象呢?該表格有600,000條記錄,我希望避免在分頁應用之前檢索它們。 – DJCasey 2010-02-16 05:12:21

相關問題