Dapper.net中的多映射

3

我正在实现我的第一个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 看起来很麻烦?

1个回答

4
我认为你不需要使用 IEnumerable<Tuple<>> 来处理简单的一对一对象关系。以下代码段应该也足够了。
var shopsPrefixes = con.Query<ShopPrefix, Shop, ShopPrefix>(sql
    , (shopPrefix, shop) =>
    {
        shopPrefix.Shop = shop;
        return shopPrefix;
    }
    , new { fiSL = fiSL }
    , splitOn: "idShop"
);
return shopsPrefixes;

+1 谢谢,看起来很有前途,但现在我遇到了 "使用多映射 API 时,请确保设置 splitOn 参数(如果您有除 Id 之外的键)" 的问题。使用 Tuple 就可以解决这个问题。我会修改你的答案以展示我所做的更改(我需要 ShopPrefixes 而不是 Shops)。 - Tim Schmelter
你的DTO长什么样子?如果ShopPrefix是Shop的子级,我认为你必须将以下内容定义为查询类型:Query<Shop,ShopPrefix,Shop>。我不确定Dapper是否可以从子级映射到父级 :) - Alex
每个“ShopPrefix”都属于/拥有一个“Shop”(在数据库中为外键),而一个“Shop”可以有多个前缀。我想要初始化(可能是多个)带有其相关“Shop”的“ShopPrefix”。 - Tim Schmelter
你是对的,只是顺序错了。所以这样可以:con.Query<ShopPrefix, Shop, ShopPrefix>(和我的原始查询顺序相同)。非常感谢。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接