2012-11-15 50 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