2012-11-15 56 views
2

我想爲選擇編寫一個簡單的QueryProvider並保持失敗。這是我的示例查詢:LINQ 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; 
} 

Ru它會拋出異常(在GetEnumerator()調用中):

Unable to cast object of type '<Exec>d__0' to type 'System.Collections.Generic.IEnumerable`1[<>f__AnonymousType0`1[System.String]]'. 

如何解決此問題?

+0

是Exec和在不同的組件查詢? – usr

+0

當你只是返回字符串而不是匿名類型時它工作嗎? – Rik

回答

1

從Exec返回的IEnumerableIEnumerable<object>。它恰好返回從對象派生的類型的元素,但其接口類型僅爲IEnumerable<object>。這就是爲什麼你不能將它投射到IEnumerable1[<>f__AnonymousType01[System.String]]

你可以將它轉換元件的角度來看,雖然:

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

這工作,謝謝。一個快速的後續問題:對於一個更復雜的問題版本,Exec()方法必須位於不同的程序集中。這裏我再次收到一個異常:[A] <> f__AnonymousType0'1 [System.String]不能轉換爲[B] <> f__AnonymousType0'1 [System.String]。 A型源自...在這種情況下我能做些什麼? – user1622959

+0

將匿名類型轉換爲命名類,以便您可以通過名稱引用它進行交叉裝配。 – usr

+0

包含Exec()的程序集由庫在運行時動態創建,因此可以在那裏創建指定的類(具體取決於表達式樹的內容)。但是,包含LINQ查詢的程序集位於庫之外,應該支持使用匿名類型。其他解決方案? – user1622959