我使用Dapper查询一个巨大的表(超过300列)。
此表由类表示。现在,我不希望这个类有300个属性,所以我认为,因为大部分列都遵循B001
到B299
的简单命名模式,我会上课继承自DynamicObject
并在构造函数中添加我的动态成员,如下所示:
class HugeTable : DynamicObject
{
Dictionary<string, object> _dynamicMembers = new Dictionary ...
public override bool TryGetMember(GetMemberBinder binder, out object result) {
// simply delegate to the dictionary
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
// same here
}
public HugeTable()
{
for (var i = 1; i < 300; i++)
{
_dynamicMembers.Add(...);
}
}
}
我认为Dapper也会填充我的动态属性,但事实并非如此。 TrySetMember
没有被点击,所以我猜Dapper并没有尝试将结果中的列映射到动态成员。
我无法深入到Dapper的内部,看看映射是如何工作的,但我确实知道,对从DynamicObject
继承的类使用反射不会返回动态成员。如果这就是Dapper的工作方式,我恐怕已经搞砸了。
我有什么遗失的吗?我是否可以选择输入(生成,真正)300个属性?
仅针对上下文,我需要所有列,因为该对象(实际上非常类似)需要暴露给IronPython
脚本,并且语法如下:
obj.b001 + obj.b002
比说起来要麻烦得多:
obj['b001'] + obj['b002']
我真的更喜欢它,因为编写这些脚本的人不一定是软件工程师。