Dot-Net

如何將 DBQuery<T> 轉換為 ObjectQuery<T>?

  • July 17, 2013

我有一個DBQuery&lt;T&gt;轉換為一個IQueryable&lt;T&gt;(這個位工作正常)。但後來我試圖將 IQueryable 轉換為 ObjectQuery .. 但失敗了:-

public void Foo(this IQueryable&lt;T&gt; source)
{
   // ... snip ...

   ObjectQuery&lt;T&gt; objectQuery = source as ObjectQuery&lt;T&gt;;
   if (objectQuery != null)
   {
       // ... do stuff ...
   }
}

在我改用 Entity-Framework 4 CTP5 Magic Unicorn blah blah blah之前,這曾經有效。現在,它不起作用 - 即。objectQuerynull

現在,DBQuery&lt;T&gt; inherits IQueryable&lt;T&gt;..所以我認為這應該可行。

如果我將程式碼更改為..

var x = (ObjectQuery&lt;T&gt;) source;

然後引發以下異常:-

System.InvalidCastException:無法轉換類型為“System.Data.Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1 ”的對象

$$ Tests.Models.Order $$'.

有什麼建議麼?

DbQuery&lt;T&gt;containsInclude方法,因此您無需轉換為ObjectQuery. ObjectQuery無法從DbQuery實例訪問 - 它被包裝在內部類型中InternalQuery,並且未定義轉換運算符。

順便提一句。當您添加using System.Data.Entity並引用 CTP5 時,您將能夠Include呼叫IQueryable&lt;T&gt;

使用反射,您可以這樣做:

var dbQuery = ...;
var internalQueryField = dbQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f =&gt; f.Name.Equals("_internalQuery"));
var internalQuery = internalQueryField.GetValue(dbQuery);
var objectQueryField = internalQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(f =&gt; f.Name.Equals("_objectQuery"));

// Here's your ObjectQuery!
var objectQuery = objectQueryField.GetValue(internalQuery) as ObjectQuery&lt;T&gt;;

引用自:https://stackoverflow.com/questions/4766122