我正在学习 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。 最佳答案
我想,除非我误解你只是想打电话
connection.Query(statement, parameters);
没有通用参数来做你所要求的给你一个简洁的行。然后你可以写
connection.Query(statement, parameters).Select(x => new { Something = x.Something});
创建一个匿名对象。
或者为了更复杂一点,您可以通过将行转换为
IDictionary<string,object>
并迭代地将属性分配给 expando 对象来转换为 expando 对象。关于c# - 使用 Dapper 创建匿名对象的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44067765/