如何使用DataContext.ExecuteQuery返回的未知类型的对象

因此,随着C#4.0中dynamic关键字的出现,我希望我能找到一个更好的解决方案来解决在选择任意列时处理DataContext.ExecuteQuery返回的类型的问题。

在过去,我创建了一个新类型来保存此类查询的结果,或者使用此SOpost中描述的方法。 所以,既然我能够处理在.NET 4.0下运行的新项目,我就开始尝试使用动态类型以一种不太痛苦的方式完成同样的事情。

所以,我给了这个镜头:

 var result = _db.ExecuteQuery( "SELECT CustomerID,City FROM Customers", new object[0] ); foreach( var d in result ) { MessageBox.Show( String.Format( "{0}, {1}", d.CustomerID, d.City ) ); } 

在运行时抛出exception,因为动态对象的属性CustomerID不存在。 所以,由于我在这一点上对动态关键字的体验是零(文章/博客文章或两篇,没有真正的经验),我希望有人在这里可以让我知道我在这里尝试做什么甚至是可能的。 我可能高估了ExecuteQuery背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射。 任何帮助深表感谢。

最近,我们写了一本小巧玲珑 ,它完美地符合原始问题:

 var result = connection.Query( "SELECT CustomerID,City FROM Customers"); foreach( var d in result ) { MessageBox.Show( String.Format( "{0}, {1}", d.CustomerID, d.City ) ); } 

它允许参数等,并且通过Query有一个(首选)类型的API – 但dynamic API也可以正常工作。

通过检查T和使用reflection来完成映射 – 在这种情况下, dynamic 实际上只是object一个奇特的词。 目前,您可能只需创建与预期布局匹配的类型。

您可以尝试传入Tuple ,但我还没有尝试过这个,我不确定它是否会实现将ctor arg 0映射到col 0等。

我在问题中使用的代码相当多,创建一个有意义的存根类通常不是问题,特别是对于自动实现的属性。