4

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

在过去,我要么创建了一个新类型来保存此类查询的结果,要么使用了此 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 背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射而起作用的。任何帮助深表感谢。

4

2 回答 2

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 ) );        
}

它允许参数等,并且有一个(首选)类型化 API via Query<T>- 但dynamicAPI 也可以正常工作。

于 2011-05-13T09:31:10.627 回答
1

映射是通过检查T和使用反射来完成的——在这种情况下,dynamic实际上只是一个花哨的词object。现在,您可能只需要创建与预期布局匹配的类型。

您可以尝试传递Tuple<int,string>,但我还没有尝试过,而且我不确定它是否会实现将 ctor arg 0 映射到 col 0 等。

我在问题中使用了很多类似的代码,并且创建有意义的存根类通常不是问题,尤其是对于自动实现的属性。

于 2011-02-17T06:56:57.957 回答