2011-01-22 6 views
12

私はに変換するDBQuery<T>を持っています(このビットは正常に動作します)。しかし、私は失敗した...のObjectQueryへのIQueryableを変換しようとしている: -DBQuery <T>をObjectQuery <T>に変換するにはどうすればよいですか?

私はエンティティフレームワーク4 CTP5 マジックユニコーン何とか何とか何とかに切り替える前に、これが動作するために使用
public void Foo(this IQueryable<T> source) 
{ 
    // ... snip ... 

    ObjectQuery<T> objectQuery = source as ObjectQuery<T>; 
    if (objectQuery != null) 
    { 
     // ... do stuff ... 
    } 
} 

。さて、それは動作していません - つまり。 objectQuerynullです。

今、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.ObjectQuery 1 [Tests.Models.Order] '。

+1

は、なぜあなたはのObjectQueryにキャストする必要がありますか? – anon

+0

私は、DBQueryを取り、ObjectQueryを構築するメソッドが必要になると思います。それまたは明示的な変換。私はどちらかが痛みであることを理解しています。 –

+1

これは興味深い質問です。 DbContextとObjectContextの違いは、DbQueryとObjectQueryとの直接の関係はありません。私は直接的な変換が可能であるとは思わない。繰り返しますが、最初にキャストが必要な理由を再検討する必要があります。また、「ソース」はどこから来ていますか? – anon

答えて

15

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

Btw。 using System.Data.Entityとrefrence CTP5を追加すると、IQueryable<T>Includeと電話することができます。リフレクションを使用して

+0

途中!ウィキッド:)確かにそうです!実際、intはCTP5 System.Data.Entiy.DbExtensions名前空間にあります!そして、コードはEF 3.5のコードとまったく同じです(多かれ少なかれ)。 (私は自分自身で 'ObjectSet'の拡張メソッドをインクルードしました(私はそれが' ObjectSet'だったと思います..)Dude - THANKS SO MUCH!win win win ... –

0

あなたは何をしようとしているのかよく分かりませんが、dynamic変数のヘルプはありますか?

Using Type dynamic (C# Programming Guide)

+0

ObjectQuery を持つ必要があるので、私はそのように思っていません。そこで、Includeメソッドにアクセスできるようにします。 –

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>; 
関連する問題