我有一个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 ...
}
}这是以前的工作之前,我改变了实体-框架4 CTP5魔术独角兽之类的等等。现在,它不起作用了。objectQuery是null。
现在DBQuery<T> inherits IQueryable<T> ..。所以我觉得这个应该能行。
如果我把代码改为..。
var x = (ObjectQuery<T>) source;然后引发以下异常:
'System.Data.Entity.Infrastructure.DbQuery
1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1Tests.Models.Order'.:无法转换类型为System.InvalidCastException的对象
有什么建议吗?
发布于 2011-01-22 17:08:12
DbQuery<T>包含Include方法,因此不需要转换为ObjectQuery。ObjectQuery无法从DbQuery实例中访问--它封装在内部类型InternalQuery中,转换运算符没有定义。
顺便说一句。当您添加using System.Data.Entity和RerenceCTP5时,您将能够在IQueryable<T>上调用Include!
发布于 2012-09-21 17:38:23
使用反射,您可以这样做:
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>;发布于 2011-01-22 04:53:49
不确定您想用它做什么,但是dynamic变量会有帮助吗?
使用类型动态(C#编程指南)
https://stackoverflow.com/questions/4766122
复制相似问题