Как преобразовать DBQuery в ObjectQuery?

у меня есть 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 волшебный единорог бла-бла-бла. Теперь, это не работает - т. е. objectQuery is null.

теперь DBQuery<T> inherits IQueryable<T> .. поэтому я подумал, что это должно сработать.

если я изменю код на ..

var x = (ObjectQuery<T>) source;

затем возникает следующее исключение: -

3 ответов


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

кстати. при добавлении using System.Data.Entity и refrence CTP5 вы сможете позвонить Include on 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 переменной помочь?

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