LINQ QueryProvider选择

时间:2012-11-15 16:15:52

标签: c# linq select iqueryable

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

Exec返回的IEnumerableIEnumerable<object>。它碰巧返回从object派生的类型的元素,但它的接口类型只是IEnumerable<object>。这就是为什么你不能把它投射到IEnumerable1[<>f__AnonymousType01[System.String]]

你可以按元素方式进行投射:

return ((IEnumerable)this.provider.Execute(this.expression)).Cast<T>().GetEnumerator();