2012-07-17 154 views
4

我正在實施我的第一個Dapper.Net項目。現在我想知道什麼是最簡單的方法來初始化包含另一個對象(多映射)的對象。dapper.net中的多重映射

這裏是我的代碼:

public static IEnumerable<ShopPrefix> GetShopPrefixes(short fiSL) 
{ 
    using (var con = new SqlConnection(Properties.Settings.Default.RM2Con)) 
    { 
     const String sql = @" 
      SELECT locShopPrefix.idShopPrefix, 
        locShopPrefix.fiSL, 
        locShopPrefix.fiShop, 
        locShopPrefix.Prefix, 
        locShopPrefix.Active, 
        locShop.idShop, 
        locShop.ShopName, 
        locShop.ContactPerson, 
        locShop.Street, 
        locShop.ZIP, 
        locShop.City, 
        locShop.Telephone, 
        locShop.Telefax, 
        locShop.Email, 
        locShop.ShopKey 
      FROM locShopPrefix 
        INNER JOIN locShop 
         ON locShopPrefix.fiShop = locShop.idShop 
      WHERE (locShopPrefix.fiSL = @fiSL);"; 
     con.Open(); 
     IEnumerable<Tuple<ShopPrefix,Shop>> shops = 
      con.Query<ShopPrefix, Shop, Tuple<ShopPrefix, Shop>>(
      sql 
      , (shopPrefix, shop) => Tuple.Create(shopPrefix, shop) 
      , new { fiSL = fiSL }, splitOn: "idShop" 
     ); 
     foreach (var shop in shops) 
      shop.Item1.Shop = shop.Item2; 
     return shops.Select(t => t.Item1); 
    } 
} 

所以每次shopPrefix屬於(有)一個Shop

問:這是自Tuple方法具有以下foreach兩個對象映射到初始化屬性Shop看起來笨重的正確方法是什麼?

回答

3

我不認爲你需要一個簡單的一對一對象關係IEnumerable<Tuple<>>。 以下片段應該也足夠了。

var shopsPrefixes = con.Query<ShopPrefix, Shop, ShopPrefix>(sql 
    , (shopPrefix, shop) => 
    { 
     shopPrefix.Shop = shop; 
     return shopPrefix; 
    } 
    , new { fiSL = fiSL } 
    , splitOn: "idShop" 
); 
return shopsPrefixes; 
+0

+1謝謝,看起來很有前途,但現在我越來越_「當使用多地圖API確保您設置的splitOn PARAM如果你有多個id其他鍵」 _。隨着'Tuple'的運作。我會修改你的答案以表明我已經改變了(我需要'ShopPrefixes'而不是'Shops')。 – 2012-07-17 17:19:21

+0

你的DTO的外觀如何?如果ShopPrefix是Shop的孩子,我認爲您必須針對查詢類型定義以下內容:查詢。我不確定Dapper是否可以做一個從Child到Parent的逆映射:) – Alex 2012-07-17 17:23:08

+0

每個ShopPrefix都屬於/有一個Shop,而Shop有多個前綴。我想初始化(可能是多個)'ShopPrefix'及其相關的'Shop'。 – 2012-07-17 17:28:13