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

IEnumerableExec から返されるのは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 に答える