我對Dapper-dot-net“沒有列名”有一個非常相似的問題,但答案是沒有讓我到達我需要的地方。
我正在編寫一個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源不需要列名,並允許我按列號映射?
非平凡約束的問題不斷出現;最近出現在這裡: 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
等)