應用於實體框架中,擴展方法和Select()
既OrderBy()
返回一個ObjectQuery
,其被定義爲:什麼時候ObjectQuery真的是IOrderedQueryable?
public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
IQueryable<T>, <... more interfaces>
的Select()
返回類型是IQueryable<T>
和的OrderBy
是IOrderedQueryable<T>
。所以你可以說,兩者都返回相同的類型,但在不同的包裝。幸運的是,因爲現在我們可以在調用OrderBy
之後申請ThenBy
。
現在我的問題。
比方說,我有這樣的:
var query = context.Plots.Where(p => p.TrialId == 21);
這給了我一個IQueryable<Plot>
,這是一個ObjectQuery<Plot>
。但是,這也是一個IOrderedQueryable:
var b = query is IOrderedQueryable<Plot>; // True!
但還是:
var query2 = query.ThenBy(p => p.Number); // Does not compile.
// 'IQueryable<Plot>' does not contain a definition for 'ThenBy'
// and no extension method 'ThenBy' ....
當我這樣做:
var query2 = ((IOrderedQueryable<Plot>)query).ThenBy(p => p.Number);
彙編,而是給出了一個運行時異常:
f類型'
IQueryable`1[Plot]
'的表達式不能使用或「方法的」IOrderedQueryable`1[Plot] ThenBy[Plot,Nullable`1](IOrderedQueryable`1[Plot], Expressions.Expression`1[System.Func`2[Plot,System.Nullable`1[System.Int32]]])
'IOrderedQueryable`1[Plot]
類型'
鑄造被執行(我檢查),但是ThenBy
參數的參數仍然被視爲IQueryable的(其困惑我一個位)。
現在假設某種方法返回ObjectQuery<Plot>
給我,如IQueryable<Plot>
(如Select()
)。如果我想知道在返回的對象上調用ThenBy
是否安全,該怎麼辦?如果ObjectQuery
是「真實的」或「假的」IOrderedQueryable
而沒有捕捉到豁免,我怎樣才能知道它?
我建議不要檢查具體類型,因爲它會將您與查詢提供程序綁定在一起,這正是IQueryable所避免的。一種方法是快速檢查表達式來檢查'SortBy()'方法,但我懷疑有人會指出一些更容易的方法。如果沒有,請在這裏留言,我會爲您提供走樹的代碼。祝你好運 – Smudge202
@ Smudge202謝謝。有很多地方比表情樹更有趣,但如果你無法抗拒......但是,也許是別人。 –
@ Smudge202順便說一句,檢查具體類型將無法正常工作,因爲它實現了兩個接口。令我感到困惑的是,普通的反思在這裏並沒有什麼幫助,所以如果我真的需要知道的話,那麼可能需要進行更深入的檢查。 –