【问题标题】:Dapper Column number rather than column name?Dapper 列号而不是列名?
【发布时间】:2012-07-27 01:32:48
【问题描述】:

我有一个与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
");

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

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

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

我该怎么做?有人可以指出我正确的方向来修改 Dapper 源以不需要列名并允许我按列号映射吗?

【问题讨论】:

    标签: .net dapper


    【解决方案1】:

    非平凡绑定的问题不断出现;它最近出现在这里: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 等)

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多