代码之家  ›  专栏  ›  技术社区  ›  Chris

在单个变量和列表变量之间重用DTO映射

  •  1
  • Chris  · 技术社区  · 6 年前

    我们经常编写这样的扩展方法,将数据库对象转换为DTO对象,以便在系统中的其他地方使用。

    正如您在下面的示例中看到的,实际的映射代码是重复的。是否可以编写可在这两种方法中使用的可重用选择映射?

        public static async Task<List<Group>> ToCommonListAsync(this IQueryable<DataLayer.Models.Group> entityGroups)
        {
            var groups =
                await entityGroups.Select(
                    g =>
                        new Group()
                        {
                            Id = g.Id,
                            AccountId = g.AccountId,
                            Name = g.Name,
                            ParentId = g.ParentId,
                            UserIds = g.GroupUserMappings.Select(d => d.UserId).ToList()
                        }).ToListAsync();
    
            return groups;
        }
    
        public static async Task<Group> ToCommonFirstAsync(this IQueryable<DataLayer.Models.Group> entityGroups)
        {
            var group =
                await entityGroups.Select(
                    g =>
                        new Group()
                        {
                            Id = g.Id,
                            AccountId = g.AccountId,
                            Name = g.Name,
                            ParentId = g.ParentId,
                            UserIds = g.GroupUserMappings.Select(d => d.UserId).ToList()
                        }).FirstOrDefaultAsync();
    
            return group;
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Peter    6 年前

    您可以将映射/投影代码移到如下变量中:

    public static class Extensions
    {
        private static readonly Expression<Func<DataLayer.Models.Group, Group>> Projection = g => 
            new Group
            {
                Id = g.Id,
                AccountId = g.AccountId,
                Name = g.Name,
                ParentId = g.ParentId,
                UserIds = g.GroupUserMappings.Select(d => d.UserId).ToList()
            };
    
        public static async Task<List<Group>> ToCommonListAsync(this IQueryable<DataLayer.Models.Group> entityGroups)
        {
            return await entityGroups.Select(Projection).ToListAsync();
        }
    
        public static async Task<Group> ToCommonFirstAsync(this IQueryable<DataLayer.Models.Group> entityGroups)
        {
            return await entityGroups.Select(Projection).FirstOrDefaultAsync();
        }
    }