因此,随着C#4.0中dynamic关键字的出现,我希望能够在选择任意列时找到更好的解决DataContext.ExecuteQuery
返回类型问题的解决方案。
过去我创建了一个新类型来保存这样的查询结果,或者使用了in this SO post描述的方法。因此,既然我能够处理在.NET 4.0下运行的新项目,我就会研究使用动态类型以一种不那么痛苦的方式完成同样的事情。
所以,我给了他一个镜头:
var result = _db.ExecuteQuery<dynamic>( "SELECT CustomerID,City FROM Customers", new object[0] );
foreach( var d in result )
{
MessageBox.Show( String.Format( "{0}, {1}", d.CustomerID, d.City ) );
}
在运行时抛出异常,因为动态对象的属性CustomerID不存在。所以,由于我在这一点上对动态关键字的体验是零(文章/博客文章或两篇,没有真正的经验)我希望有人在这里可以让我知道我在这里尝试做什么甚至是可能的。我可能高估了ExecuteQuery背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射。非常感谢任何帮助。
答案 0 :(得分:6)
最近,我们编写了dapper,它完美地符合原始问题:
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<T>
有一个(首选)类型的API - 但dynamic
API工作正常。
答案 1 :(得分:1)
映射是通过检查T
并使用反射来完成的,而dynamic
真的只是这个上下文中object
的一个奇特的词。目前,您可能只需创建与预期布局匹配的类型。
你可以尝试传递Tuple<int,string>
,但我还没试过,我不确定它是否会意识到将ctor arg 0映射到col 0等等。 / p>
我在问题中使用了类似的代码,创建一个有意义的存根类通常不是问题,特别是对于自动实现的属性。