繁体   English   中英

这是使用 Dapper 进行映射的有效方式吗?

[英]Is this an efficient way of mapping with Dapper?

我试图 map 类别实体内的 Products 和 CategoryPictures 属性列表。

然后我在 CategoryPictures 中映射图片 object。

我不确定这是否是我第一次使用 dapper 的有效方式。 我曾经使用实体框架。

我使用 Dapper 而不是 EF,因为我想提高我的 sql 技能。

我应该使用多个结果吗?

  public async Task<IEnumerable<Category>> GetCategoriesListAsync()
    {
        using (var conn = SqlConnection())
        {
            string sql = @"select c.*, cp.*, pd.*, p.*
                        from Categories c 
                        inner join CategoryPictures cp on cp.CategoryId = c.Id 
                        inner join Products pd on pd.CategoryId = c.Id
                        inner join Pictures p on p.Id = cp.PictureId";



            //string sqlmulti = $@"select * from {tableName};
            //                   select * from Products";

            //List<Category> cat = null;
            //List<Product> prod = null;


            //using (var lists = conn.QueryMultiple(sqlmulti))
            //{
            //    cat = lists.Read<Category>().ToList();
            //    prod = lists.Read<Product>().ToList();
            //}

            var lookup = new List<Category>();

            await conn.QueryAsync<Category, CategoryPicture, Product, Picture, Category>(sql,
                                        (c, cp, pd, p) =>
                                        {
                                            if (lookup.FirstOrDefault(x => x.Id == c.Id) == null)
                                            {
                                                lookup.Add(c);
                                            }

                                            c.CategoryPictures.AsList().Add(cp);
                                            c.Products.AsList().Add(pd);
                                            foreach (var item in c.CategoryPictures)
                                            {
                                                item.Picture = p;
                                            }

                                            return null;
                                        });
            return lookup;

        }
    }

我已经删除了 Category 和 Product 之间的链接,其中 Product 是 Category 的子级。

我在之前的代码中遇到的问题是 CategoryPictures 的 Picture 子项没有正确填充。 所以我在填充 CategoryPicture 之前设置了 CategoryPicture 的图片 object。

  public async Task<IEnumerable<Category>> GetAllCategories()
    {
        using (var conn = SqlConnection())
        {

            string sql = @"select c.Id, c.Name, c.Description, c.Created, c.LastModified,
                               cp.Id, cp.CategoryId, cp.PictureId, 
                               p.Id, p.Url
                        from Categories c 
                        inner join CategoryPictures cp on cp.CategoryId = c.Id
                        inner join Pictures p on p.Id = cp.PictureId";

            var lookup = new Dictionary<int, Category>();
            await conn.QueryAsync<Category, CategoryPicture, Picture, Category>(sql,
                                   (c, cp, p) =>
                                   {
                                       if (!lookup.TryGetValue(c.Id, out Category found))
                                       {
                                           lookup.Add(c.Id, found = c);
                                       }

                                       cp.Picture = p;

                                       found.CategoryPictures.AsList().Add(cp);


                                       return null;
                                   });

            return lookup.Values.ToList();

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM