12

我有一个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.ObjectQuery1 [Tests.Models.Order]”的对象。

有什么建议么?

4

3 回答 3

16

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

顺便提一句。当您添加using System.Data.Entity并引用 CTP5 时,您将能够Include调用IQueryable<T>

于 2011-01-22T17:08:12.187 回答
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>;
于 2012-09-21T17:38:23.383 回答
0

不确定你想用它做什么,但dynamic变量会有帮助吗?

使用动态类型(C# 编程指南)

于 2011-01-22T04:53:49.933 回答