【问题标题】:Multi mapping in dapper.netdapper.net 中的多映射
【发布时间】:2012-07-17 10:50:46
【问题描述】:

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

【问题讨论】:

    标签: c# dapper


    【解决方案1】:

    我认为对于简单的一对一对象关系,您不需要 IEnumerable&lt;Tuple&lt;&gt;&gt;。 下面的 sn-p 也应该足够了。

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

    【讨论】:

    • +1 谢谢,这看起来很有希望,但现在我得到了“使用多映射 API 时,如果您有除 Id 以外的键,请确保设置 splitOn 参数”。使用Tuple,它起作用了。我将修改您的答案以显示我所做的更改(我需要 ShopPrefixes 而不是 Shops)。
    • 您的 DTO 看起来如何?如果 ShopPrefix 是 Shop 的子级,我认为您必须为查询类型定义以下内容:Query。我不确定 Dapper 是否可以进行从 Child 到 Parent 的逆映射:)
    • 每个ShopPrefix 属于/有一个Shop(DB 中的FK),而Shop 可以有多个前缀。我想用相关的Shop 初始化(可能是多个)ShopPrefix
    • 你是对的,只是顺序错了。所以这有效:con.Query&lt;ShopPrefix, Shop, ShopPrefix&gt;(与我原始查询中的顺序相同)。非常感谢。
    猜你喜欢
    • 2011-12-01
    • 2013-09-24
    • 2011-10-06
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多