【问题标题】:Creating instances of anonymous objects using Dapper使用 Dapper 创建匿名对象的实例
【发布时间】:2017-05-19 10:32:43
【问题描述】:

我正在学习 Dapper,但我无法使用它创建匿名类型的实例。首先,一些上下文:我们有一个返回IEnumerable<T> 的方法。请注意,T 可以是匿名的。

IEnumerable<T> ExecuteCollection<T>(...)
{
    // Query building logic goes here.

    var statement = Something.Statement;
    var parameters = Something.Parameters;

    return _connection.Query<T>(statement, parameters);
}

此代码适用于已注册的类,例如魅力。但是,我希望它也能处理匿名类型,编译器抛出的问题是:

InvalidOperationException: "A parameterless default constructor or one matching signature ([signature of anonymous object]) is required for <>f__AnonymousType5`2[[System.Int16, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=XXX],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=XXX]] materialization"

我知道问题在于匿名对象没有可使用的构造函数。一个替代方案是(T)Activator.CreateInstance(typeof(T), row),但row 变量必须是object[],而不是DapperRow

每当我搜索有关此主题的信息时,每个人都说我不应该一开始就使用匿名类型。但是,要求我的函数返回匿名类型项的集合。

这是我第一次使用 Dapper,不知道是不是我理解错了。问题是:如何使用 Dapper 创建匿名对象的实例,或者围绕这个问题有什么替代方法,以便我的方法仍然可以返回 IEnumerable&lt;T&gt;?我正在使用 .NET Core。

【问题讨论】:

    标签: c# .net orm dapper


    【解决方案1】:

    我想,除非我误解你只是想打电话

    connection.Query(statement, parameters);
    

    没有通用参数来完全按照您的要求为您提供一个简洁的行。然后就可以写了

    connection.Query(statement, parameters).Select(x => new { Something = x.Something}); 
    

    创建一个匿名对象。

    或者更复杂一点,您可以通过将行转换为 IDictionary&lt;string,object&gt; 并迭代地将属性分配给一个 expando 对象来转换为一个 expando 对象。

    【讨论】:

    • 这就是我迄今为止想出的。问题是,我无法对 new 对象中的属性进行硬编码,而且我不确定如何以编程方式迭代 DapperRow 和我的类型的属性,以便在 @987654326 中重建新对象的结构@.
    • 我认为您可以将每一行转换为 (IDictionary)
    猜你喜欢
    • 2020-12-28
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多