Dapper Номер столбца, а не имя столбца?

У меня очень похожий вопрос на Dapper-dot-net без имени столбца, но ответ там не приводит меня туда, куда мне нужно.

Я пишу веб-интерфейс и использую dapper для получения данных из хранимых процедур из системы ERP моего клиента. SP возвращает 4 столбца данных без имен столбцов. При этом SP заблокированы, и я не могу их изменить. Я пытался обойти это, используя временную таблицу в своем запросе, как предложил Сэм.

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, чтобы не требовать имен столбцов и позволить мне отображать по номеру столбца?


person studiothat    schedule 28.07.2012    source источник


Ответы (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 и т. д.)

person Marc Gravell    schedule 28.07.2012