2011-01-22 11 views
12

Mam DBQuery<T>, który konwertuje do IQueryable<T> (ten bit działa dobrze). Ale potem próbuję przekonwertować IQueryable do ObjectQuery .. który nie: -Jak przekonwertować obiekt DBQuery <T> na obiekt ObjectQuery <T>?

public void Foo(this IQueryable<T> source) 
{ 
    // ... snip ... 

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

To używane do pracy, zanim zmienił się do Entity-ramowego 4 CTP5 Magiczne Unicorn bla bla bla. Teraz to nie działa - np. objectQuery to null.

Teraz DBQuery<T> inherits IQueryable<T> .. więc pomyślałem, że to powinno działać.

przypadku zmiany kodu do ..

var x = (ObjectQuery<T>) source; 

następnie następujące jest wyjątek: -

System.InvalidCastException: Nie można rzutować obiektu typu „System.Data. Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery 1 [Tests.Models.Order] '.

Wszelkie sugestie?

+1

Dlaczego trzeba oddać go do ObjectQuery? – anon

+0

Myślę, że będziesz potrzebować metody, która pobiera DBQuery i konstruuje obiekt ObjectQuery. To lub wyraźna konwersja. Zdaję sobie jednak sprawę, że jeden z nich to ból. –

+1

To interesujące pytanie. DbQuery nie ma bezpośredniego związku z ObjectQuery, w przeciwieństwie do DbContext kontra ObjectContext. Wątpię, aby możliwa była bezpośrednia konwersja. Ponownie, powinieneś ponownie zbadać, dlaczego potrzebujesz obsady w pierwszej kolejności. Skąd pochodzi "źródło"? – anon

Odpowiedz

15

DbQuery<T> zawiera Include metodę, dzięki czemu nie trzeba konwertować do ObjectQuery. ObjectQuery jest niedostępny z instancji DbQuery - jest zawijany w typie wewnętrznym InternalQuery, a operator konwersji nie jest zdefiniowany.

Przy okazji. po dodaniu using System.Data.Entity i odszukaniu CTP5 będziesz mógł zadzwonić pod numer Include pod numerem IQueryable<T>!

+0

nie ma mowy! wikid :) Na pewno ma! W rzeczywistości int jest w przestrzeni nazw CTP5 System.Data.Entiy.DbExtensions! Kod jest (mniej więcej) dokładnie taki, jaki miałem dla mojego kodu EF 3.5. (Zrobiłem własne metody rozszerzenia "ObjectSet" (myślę, że to było "ObjectSet" ...) Dude - DZIĘKI TAK DUŻO! Win win win ... –

0

Nie jesteś pewien, co chcesz z tym zrobić, ale czy zmienna dynamic pomoże?

Using Type dynamic (C# Programming Guide)

+0

Nie sądzę, ponieważ muszę mieć ObjectQuery , więc mogę uzyskać dostęp do metody Include na nim. –

11

Korzystanie refleksję, można to zrobić:

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>; 
Powiązane problemy