使用Dapper创建匿名对象的实例

时间:2017-05-19 10:32:43

标签: c# .net orm dapper

我正在学习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<T>?我使用的是.NET Core。

1 个答案:

答案 0 :(得分:3)

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

$.each(myobj, function(index, value) { 

    console.log(myobj[index]);

   )};

没有通用参数可以完全按照您的要求为您提供一个精巧的行。然后你可以写

connection.Query(statement, parameters);

创建匿名对象。

或者为了让您更复杂一点,您可以通过将行转换为connection.Query(statement, parameters).Select(x => new { Something = x.Something}); 来转换为expando对象,并迭代地将属性分配给expando对象。