首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将DBQuery<T>转换为ObjectQuery<T>?

如何将DBQuery<T>转换为ObjectQuery<T>?
EN

Stack Overflow用户
提问于 2011-01-22 04:08:06
回答 3查看 12.8K关注 0票数 12

我有一个DBQuery<T>,它可以转换成一个IQueryable<T> (这一点很好)。但我想把IQueryable转换成ObjectQuery。失败了:-

代码语言:javascript
复制
public void Foo(this IQueryable<T> source)
{
    // ... snip ...

    ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
    if (objectQuery != null)
    {
        // ... do stuff ...
    }
}

这是以前的工作之前,我改变了实体-框架4 CTP5魔术独角兽之类的等等。现在,它不起作用了。objectQuerynull

现在DBQuery<T> inherits IQueryable<T> ..。所以我觉得这个应该能行。

如果我把代码改为..。

代码语言:javascript
复制
var x = (ObjectQuery<T>) source;

然后引发以下异常:

'System.Data.Entity.Infrastructure.DbQuery1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1Tests.Models.Order'.:无法转换类型为System.InvalidCastException的对象

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-22 17:08:12

DbQuery<T>包含Include方法,因此不需要转换为ObjectQueryObjectQuery无法从DbQuery实例中访问--它封装在内部类型InternalQuery中,转换运算符没有定义。

顺便说一句。当您添加using System.Data.Entity和RerenceCTP5时,您将能够在IQueryable<T>上调用Include

票数 16
EN

Stack Overflow用户

发布于 2012-09-21 17:38:23

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

代码语言:javascript
复制
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>;
票数 11
EN

Stack Overflow用户

发布于 2011-01-22 04:53:49

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4766122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档