Как я могу преобразовать DBQuery <T>в ObjectQuery <T>? - PullRequest
12 голосов
/ 22 января 2011

У меня есть 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.ObjectQuery 1 [Tests.Models.Order]'.

Есть предложения?

Ответы [ 3 ]

16 голосов
/ 22 января 2011

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

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

11 голосов
/ 21 сентября 2012

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

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>;
0 голосов
/ 22 января 2011

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

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

...