C# 这是使用Dapper进行映射的有效方法吗?

C# 这是使用Dapper进行映射的有效方法吗?,c#,.net,dapper,C#,.net,Dapper,我正在尝试映射类别实体内的产品和类别结构属性列表 然后,我将图片对象映射到CategoryPictures中 我不确定这是否是我第一次使用dapper的有效方法。我曾经使用entityframework 我使用Dapper而不是EF,因为我想提高我的sql技能 我应该使用多个结果吗 public async Task<IEnumerable<Category>> GetCategoriesListAsync() { using (var con

我正在尝试映射类别实体内的产品和类别结构属性列表

然后,我将图片对象映射到CategoryPictures中

我不确定这是否是我第一次使用dapper的有效方法。我曾经使用entityframework

我使用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;

        }
    }
公共异步任务GetCategoriesListAsync() { 使用(var conn=SqlConnection()) { 字符串sql=@“选择c.*,cp.*,pd.*,p* 来自c类 cp.CategoryId=c.Id上的内部联接categorypactures cp pd.CategoryId=c.Id上的内部连接产品pd 内部连接图片p on p.Id=cp.PictureId“; //字符串sqlmulti=$@“从{tableName}中选择*; //选择“从产品中选择*”; //列表cat=null; //列表prod=null; //使用(var list=conn.QueryMultiple(sqlmulti)) //{ //cat=lists.Read().ToList(); //prod=lists.Read().ToList(); //} var lookup=新列表(); wait conn.QueryAsync(sql, (c,cp,pd,p)=> { if(lookup.FirstOrDefault(x=>x.Id==c.Id)==null) { 查找。添加(c); } c、 CategoryPictures.AsList().Add(cp); c、 Products.AsList().Add(pd); foreach(c.类别结构中的变量项) { 项目.图片=p; } 返回null; }); 返回查找; } }
我删除了类别和产品之间的链接,其中产品是类别的子项

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

  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();

        }
    }
公共异步任务GetAllCategories() { 使用(var conn=SqlConnection()) { 字符串sql=@“选择c.Id、c.Name、c.Description、c.Created、c.LastModified、, cp.Id、cp.CategoryId、cp.PictureId、, p、 Id,p.Url 来自c类 cp.CategoryId=c.Id上的内部联接categorypactures cp 内部连接图片p on p.Id=cp.PictureId“; var lookup=newdictionary(); wait conn.QueryAsync(sql, (c,cp,p)=> { 如果(!lookup.TryGetValue(c.Id,找到的类别之外)) { lookup.Add(c.Id,found=c); } cp.Picture=p; 找到.CategoryPictures.AsList().Add(cp); 返回null; }); 返回lookup.Values.ToList(); } }
将列表更改为_字典这将大大改进对现有类别id的搜索对于具有
Select*
的许多表(无论如何都应该避免),是的,我将使用多个结果集并使用字典映射。请记住,Dapper不喜欢多个具有相同属性的列names@Charlieface,我是否仍然需要对多个结果集使用Select*?或者我必须为多个结果集指定每一列吗?您可以执行
select*
,但不建议这样做。最好显式地指定列,并且只拉出所需的列(否则会给服务器带来额外的负载)。