【问题标题】:How to work with objects of unknown type returned from DataContext.ExecuteQuery如何处理从 DataContext.ExecuteQuery 返回的未知类型的对象
【发布时间】:2011-05-13 17:31:10
【问题描述】:

因此,随着 C# 4.0 中动态关键字的出现,我希望能够找到更好的解决方案来解决在选择任意列时处理 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 背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射而起作用的。非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    最近,我们写了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&lt;T&gt; 的(首选)类型化 API - 但dynamic API 也可以正常工作。

    【讨论】:

    • 非常感谢您再次访问这个 Marc。我不再从事这个项目了,但是我已经为链接添加了书签,以防将来出现(我是一个系统专家,在我的日常工作中没有很多 C#/SQL)。再次感谢。
    【解决方案2】:

    映射是通过检查T 并使用反射来完成的 - 而dynamic 真的 在这种情况下只是object 的一个花哨的词。目前,您可能只需要创建与预期布局匹配的类型。

    你可以尝试传入Tuple&lt;int,string&gt;,但我还没有尝试过,我不确定它是否会实现将ctor arg 0映射到col 0等。

    我经常使用问题中的代码,创建有意义的存根类通常不是问题,尤其是自动实现的属性。

    【讨论】:

    • 谢谢马克。创建一个存根类很好,这不是什么大问题,因为这种情况很少出现。老实说,我从来没有使用过 ExecuteQuery,因为我没有处理任何需要它的应用程序(我是一个系统专家,而不是每天大量的数据库工作)。再次感谢,我想也许我错过了一些更有经验的 DB/LINQ 开发人员。可能知道。
    • 不幸的是传递 Tuple 作为 ExecuteQuery 的类型参数对我不起作用...
    • @jaraics - 这里有一些东西;在此期间,我们编写了“dapper”;并且 dapper 具有非泛型 Query(),它返回 dynamic
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多