如何将DBQuery <t>转换为ObjectQuery <t>?</t> </t>

时间:2011-01-22 04:08:06

标签: .net entity-framework entity-framework-4 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 Magic Unicorn blah blah blah 之前,这已经过去了。现在,它不起作用 - 即。 objectQuerynull

现在,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 个答案:

答案 0 :(得分:16)

DbQuery<T>包含Include方法,因此您无需转换为ObjectQuery。无法从ObjectQuery实例访问DbQuery - 它包含在内部类型InternalQuery中,并且未定义转化运算符。

顺便说一下。当您添加using System.Data.Entity并参考CTP5时,您可以在Include上致电IQueryable<T>

答案 1 :(得分:11)

使用反射,您可以这样做:

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

答案 2 :(得分:0)

不确定您要尝试使用它,但dynamic变量会有帮助吗?

Using Type dynamic (C# Programming Guide)