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

时间:2011-02-17 06:20:50

标签: c# linq-to-sql dynamic executequery

因此,随着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背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射。非常感谢任何帮助。

2 个答案:

答案 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>

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