Dot-Net
如何將 DBQuery<T> 轉換為 ObjectQuery<T>?
我有一個
DBQuery<T>轉換為一個IQueryable<T>(這個位工作正常)。但後來我試圖將 IQueryable 轉換為 ObjectQuery .. 但失敗了:-public void Foo(this IQueryable<T> source) { // ... snip ... ObjectQuery<T> objectQuery = source as ObjectQuery<T>; if (objectQuery != null) { // ... do stuff ... } }在我改用 Entity-Framework 4 CTP5 Magic Unicorn blah blah blah之前,這曾經有效。現在,它不起作用 - 即。
objectQuery是null。現在,
DBQuery<T> inherits IQueryable<T>..所以我認為這應該可行。如果我將程式碼更改為..
var x = (ObjectQuery<T>) source;然後引發以下異常:-
System.InvalidCastException:無法轉換類型為“System.Data.Entity.Infrastructure.DbQuery
1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1 ”的對象$$ Tests.Models.Order $$'.
有什麼建議麼?
DbQuery<T>containsInclude方法,因此您無需轉換為ObjectQuery.ObjectQuery無法從DbQuery實例訪問 - 它被包裝在內部類型中InternalQuery,並且未定義轉換運算符。順便提一句。當您添加
using System.Data.Entity並引用 CTP5 時,您將能夠Include呼叫IQueryable<T>!
使用反射,您可以這樣做:
var dbQuery = ...; var internalQueryField = dbQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f => f.Name.Equals("_internalQuery")); var internalQuery = internalQueryField.GetValue(dbQuery); var objectQueryField = internalQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f => f.Name.Equals("_objectQuery")); // Here's your ObjectQuery! var objectQuery = objectQueryField.GetValue(internalQuery) as ObjectQuery<T>;