我正在尝试为选择编写一个简单的QueryProvider并继续失败。这是我的示例查询:
var query = from elem in MyIQueryableImplementation
select new {Name = elem.Name};
接下来是一个调用的foreach语句:
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();
}
调用(暂时忽略表达式树):
public override object Execute(Expression expression)
{
return Exec();
}
然后:
public static IEnumerable<object> Exec()
{
for(int i = 0; i < 10; i++)
{
yield return new {Name = "TEST"};
}
yield break;
}
运行它,它会抛出异常(在GetEnumerator()调用中):
Unable to cast object of type '<Exec>d__0' to type 'System.Collections.Generic.IEnumerable`1[<>f__AnonymousType0`1[System.String]]'.
我该如何解决这个问题?
答案 0 :(得分:1)
Exec返回的IEnumerable
为IEnumerable<object>
。它碰巧返回从object派生的类型的元素,但它的接口类型只是IEnumerable<object>
。这就是为什么你不能把它投射到IEnumerable1[<>f__AnonymousType01[System.String]]
。
你可以按元素方式进行投射:
return ((IEnumerable)this.provider.Execute(this.expression)).Cast<T>().GetEnumerator();