Dapper列号而非列名?

5
我有一个与 Dapper-dot-net "no column name" 很相似的问题,但那里的答案并不能满足我的需求。
我正在编写一个web界面,并使用dapper从客户的ERP系统中获取存储过程的数据。该SP返回4列没有列名的数据。也就是说,这些SP是被锁定的,我无法更改它们。 我尝试通过在查询中使用临时表来解决这个问题,就像Sam建议的那样。
var grid = QueryMultiple(@"set nocount on 
declare @t table(Id int, Name nvarchar(max), AnotherId int)

insert @t
exec proc

set nocount off 
select Id, Name from @t
select Id, AnotherId from @t
");

然而,我现在发现原始存储过程也包含一个用于记录的插入语句,因此SQL不允许我将我的存储过程插入到临时表中。

有提到添加支持:

class Foo { [ColumnNumber(1)] public string Name {get;set;} }

我该如何做这个?能否有人指导我修改Dapper源码,取消要求列名并允许我通过列号进行映射?
1个回答

3
问题出现在非平凡绑定上;最近又出现在这里:http://code.google.com/p/dapper-dot-net/issues/detail?id=108 我的建议仍然有效,虽然我还没有时间编码。我建议添加一个静态事件,您可以选择处理,并应用任何奇特的映射,例如:
SqlMapper.ColumnBind += (sender, args) {
    int colIndex = args.ColumnIndex;
    Type type = args.TargetType;
    MemberInfo member = // ... Entirely up to you to define logic
    args.Member = member;
};

上述完全是理论性的,但是否符合您的需求呢?
注意:如果未订阅 ColumnBind,则只会执行普通的基本名称映射。有什么想法吗?
(注:它也可以是每种类型的单个事件调用,而不是每列;这可能更有效率,因为订阅者将较少调用 GetProperties 等函数)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接