Как я могу преобразовать 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 бла-бла-бла. Теперь это не работает - т.е. 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.ObjectQuery1[Tests.Models.Order]".

Какие-либо предложения?

3 ответа

Решение

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

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

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

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>;

Не уверен, что вы пытаетесь сделать с этим, но будет dynamic переменная помощь?

Использование динамического типа (Руководство по программированию в C#)

Другие вопросы по тегам