12

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 blahblahblahに切り替える前は機能していました。今、それは機能していません-すなわち。objectQueryですnull

さて、DBQuery<T> inherits IQueryable<T>..だから私はこれがうまくいくはずだと思いました。

コードを..に変更した場合

var x = (ObjectQuery<T>) source;

次に、次の例外がスローされます:-

System.InvalidCastException:タイプ'System.Data.Entity.Infrastructure.DbQuery1 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery[Tests.Models.Order]'のオブジェクトをキャストできません。

助言がありますか?

4

3 に答える 3

16

DbQuery<T>メソッドが含まれてIncludeいるため、に変換する必要はありませんObjectQueryObjectQueryインスタンスからアクセスできませんDbQuery-内部型にラップされてInternalQueryおり、変換演算子が定義されていません。

ところで。using System.Data.EntityCTP5を追加して参照すると、呼び出すことIncludeができますIQueryable<T>

于 2011-01-22T17:08:12.187 に答える
11

リフレクションを使用すると、次のことができます。

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>;
于 2012-09-21T17:38:23.383 に答える
0

あなたがそれで何をしようとしているのかわかりませんが、dynamic変数は役に立ちますか?

タイプダイナミックの使用(C#プログラミングガイド)

于 2011-01-22T04:53:49.933 に答える