Dapper 列号而不是列名?

stu*_*hat 5 .net dapper

我有一个与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
");
Run Code Online (Sandbox Code Playgroud)

但是,我现在发现原始 SP 还包含一个用于日志记录的插入,因此 SQL 不允许我将我的 sp 插入到临时表中。

提到添加对以下内容的支持:

class Foo { [ColumnNumber(1)] public string Name {get;set;} }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?有人可以指出我正确的方向来修改 Dapper 源以不需要列名并允许我按列号进行映射吗?

Mar*_*ell 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;
};
Run Code Online (Sandbox Code Playgroud)

以上完全是理论上的,但它能满足您的需求吗?

注意:如果ColumnBind没有订阅,它只会像平常一样进行正常的基本名称映射。想法?

(注意:它也可以是每个类型的单个事件调用,而不是每个列;这可能更有效,因为订阅者调用等的GetProperties频率会降低)