2

我正在尝试为选择编写一个简单的 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]]'.

我该如何解决?

4

1 回答 1

1

IEnumerable从 Exec 返回的是一个IEnumerable<object>. 它恰好返回从 object 派生的类型的元素,但它的接口类型只是IEnumerable<object>. 这就是为什么您不能将其转换为IEnumerable1[<>f__AnonymousType01[System.String]].

不过,您可以按元素进行转换:

return ((IEnumerable)this.provider.Execute(this.expression)).Cast<T>().GetEnumerator();
于 2012-11-15T16:23:59.633 回答