2012-01-24 37 views
16

我正在嘗試使用Dapper與ASP.NET SQL成員提供程序表進行交互。我包裝了SqlMembershipProvider類,並添加了一個額外的方法,讓我MembershipUsers給予一定的標準,我有一些自定義表。用Dapper調用自定義構造函數?

當用Dapper查詢數據時,看起來Dapper首先使用無參數構造函數實例化類,然後將返回的列「映射」到對象的屬性上。

但是,MembershipUser類的UserName屬性沒有setter。從Dapper SqlMapper.cs中的1417行左右來看,方法GetSettableProps()只能得到可設置的屬性。

我試圖做一個MultiMap查詢來調用構造函數,但問題是傳入查詢的對象已經缺少UserName。

我猜我可以修改GetSettableProps()方法,但我不確定這是否可行,還是會影響我現有的代碼。

有沒有辦法讓我調用MembershipUser類的自定義構造函數?

或者我可以對Dapper做出合理的改變來支持我的情況嗎?

** UPDATE **

馬克的回答使用非通用/動態查詢()方法是正確的,但對於後人,這是我指的是裏面小巧玲瓏的方法:

static List<PropInfo> GetSettableProps(Type t) 
{ 
    return t 
      .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 
      .Select(p => new PropInfo 
      { 
       Name = p.Name, 
       Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), 
       Type = p.PropertyType 
      }) 
      .Where(info => info.Setter != null) 
      .ToList(); 
} 
+0

是什麼線1417的樣子順便說一句,你可以發佈您的代碼示例爲他人,也許能夠迅速幫助你..? – MethodMan

+1

說實話,我只是在這裏使用中間類型 - 或非通用查詢API(它通過「動態」)...我有一些ctor代碼,我可以從protobuf-net上解除,我真的不知道這會有好處... –

回答

24

我會用非通用查詢API在這裏...

return connection.Query(sql, args).Select(row => 
    new AnyType((string)row.Foo, (int)row.Bar) { 
     Other = (float)row.Other }).ToList(); 

使用這個,你可以同時使用非默認合作通過使用「動態」作爲中間步驟,不需要做任何改變。

+0

哇,我很尷尬,我完全錯過了! –

+3

這種方法會迫使你明確設置所有的屬性不是嗎?例如,我不能構造我的類型,然後讓Dapper自動運行結果集的屬性? – crush

+3

並非所有人都可以使用Framework v4,這是使用動態的此解決方案所必需的。如果你使用Dictionary索引來獲得你的列值,你似乎可以無動態地離開:因此,在Marc(int)row.Bar(在Dapper的v4中,行是動態的)),你可以使用(int)row [酒吧「](在Dapper 3.5行是一個詞典)等等。這不愉快,但在某些場合也許是必要的。 – Nij

1

我用這也許是幫助別人

YourList = connection.Query<YourQueryClass>(Query, arg) 
       .Select(f => new ClassWithConstructor(f.foo,f.bar)) 
       .ToList();