Как преобразовать 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.ObjectQuery 1 [Tests.Models.Order]'.

Любые предложения?

Ответ 1

DbQuery<T> содержит метод Include, поэтому вам не нужно преобразовывать его в ObjectQuery. ObjectQuery недоступен из экземпляра DbQuery - он завернут во внутренний тип InternalQuery, и оператор преобразования не определен.

Btw. при добавлении using System.Data.Entity и refrence CTP5 вы сможете вызвать Include на IQueryable<T>!

Ответ 2

Используя отражение, вы можете сделать это:

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 your ObjectQuery!
var objectQuery = objectQueryField.GetValue(internalQuery) as ObjectQuery<T>;