Numéro de colonne Dapper plutôt que nom de colonne?

.net dapper

Question

J'ai une question très similaire à Dapper-dot-net "pas de nom de colonne" , mais la réponse ne me permet pas de savoir où j'ai besoin.

J'écris une interface Web et utilise dapper pour obtenir des données à partir de procédures stockées à partir du système ERP de mon client. Le SP renvoie 4 colonnes de données sans nom de colonne. Cela étant dit, les SP sont verrouillés et je ne peux pas les changer. J'ai essayé de contourner ce problème en utilisant une table temporaire dans ma requête, comme suggéré par 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
");

Cependant, j'ai maintenant découvert que le SP original contient également un insert pour la journalisation et que SQL ne me permet donc pas d'insérer mon sp dans une table temporaire à cause de cela.

Il est question d'ajouter un support pour:

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

Comment puis-je faire ceci? Quelqu'un peut-il m'orienter dans la bonne direction pour modifier la source Dapper afin de ne pas exiger de noms de colonne et me permettre de mapper par numéro de colonne?

Réponse acceptée

La question des liaisons non triviales continue de se poser; il est apparu plus récemment ici: http://code.google.com/p/dapper-dot-net/issues/detail?id=108

Ma suggestion est là, même si je n'ai pas encore eu le temps de la coder. Je propose un événement statique que vous pouvez choisir de gérer et d’appliquer tous les mappages ésotériques souhaités, c.-à-d.

SqlMapper.ColumnBind += (sender, args) {
    int colIndex = args.ColumnIndex;
    Type type = args.TargetType;
    MemberInfo member = // ... Entirely up to you to define logic
    args.Member = member;
};

Ce qui précède est entièrement théorique, mais répondrait-il à vos besoins?

Remarque: si ColumnBind n’était pas abonné, il ne ferait que mapper les noms de base de manière normale. Pensées?

(note: il pourrait également s'agir d'un événement unique appelé par type, plutôt que par colonne; cela pourrait être plus efficace, car l'abonné appellera moins souvent GetProperties etc.)




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi