我正在学习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。
答案 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对象。