2012-05-30 28 views
1

有沒有辦法獲得LinqDataSource用來檢索數據的IQueryable對象?我認爲可能從選定事件,但它似乎不是。如何獲取LinqDataSource使用的IQueryable對象?

我表中的每一行都有一個類別字段,我想確定結果中每個類別有多少行。

我還應該注意到我使用的是DataPager,所以並不是所有的行都被返回。這就是爲什麼我想要得到IQueryable的原因,以便我可以做類似於

int count = query.Where(i => i.Category == "Category1").Count(); 

回答

1

使用QueryCreated eventQueryCreatedEventArgs有一個Query財產,其中包含IQueryable

在創建原始LINQ查詢之後引發該事件,並在將查詢表達式發送到數據庫之前包含查詢表達式,而不包含排序和分頁參數。

+0

這看起來像它會工作 - 唯一的問題是'QueryCreatedEvent'只能在.NET Framework 4和更高版本中使用,而且我仍然使用3.5版本:( –

+0

啊,太糟糕了。希望你能趕上不久! –

0

IQueryable中沒有「選定」事件。此外,如果要在服務器上過濾數據,即使API公開了它,也不可能訪問它,但要回答問題的一部分,假設您有類別 - >產品,其中每個類別有很多產品,您希望每個類別的產品數量。它會是一個簡單的LINQ查詢:

var query = GetListOfCategories(); 
var categoryCount = query.Select(c => c.Products).Count(); 

此外,根據對象GetListOfCategories回報,你可能最終不得不爲被加載並在內存中的所有條目,還是隻正確值的類型,但Linq-to-Objects(在內存中)和Linq-to-other數據源(延遲加載)之間的區別是不同的。

+0

感謝您的回答,但我認爲您誤解了我的問題。我知道IQueryable中沒有「Selected」事件。我在談論LinqDataSource(asp.net控件)。我的問題特定於LinqDataSource,而不是一般的Linq。我使用ListView/DataPager/LinqDataSource組合來處理分頁數據。如果它不是DataPager的話,我所問的會非常簡單。但是由於並不是所有的結果都返回,我需要LinqDataSource將用來獲取數據的IQueryable查詢對象的副本。 –

+0

我需要執行IQueryable對象_before_,以便我可以複製它以檢索類別中的總計數,而不僅僅檢索「頁面」上的行。 –

+0

我想它還需要在DataPager添加'.Skip(x).Take(y)'查詢之前。我試圖完成的基本原則是IQueryable在枚舉之前並不包含任何數據 - 它基本上只是一個查詢。所以我試圖獲得它,然後複製,修改和執行(枚舉)修改後的版本。 –

相關問題