代码之家  ›  专栏  ›  技术社区  ›  Callum Linington

LINQ中的AutoMapper to Entities GroupJoin

  •  0
  • Callum Linington  · 技术社区  · 11 年前

    所以我有我的地图:

    public class BlogToBlogModelAutoMapperTypeConfigurator: IAutoMapperTypeConfigurator
    {
        public void Configure()
        {
            Mapper.CreateMap<Blog, GUI.Models.Blogging.Blog>()
                .ForMember(b => b.User, c => c.Ignore())
                .ForMember(b => b.Posts, c=>c.Ignore());
        }
    }
    
    public class PostToPostModelAutoMapperTypeConfigurator : IAutoMapperTypeConfigurator
    {
        public void Configure()
        {
            Mapper.CreateMap<Post, GUI.Models.Blogging.Post>()
                .ForMember(p => p.User, c => c.Ignore());
        }
    }
    
    public class UserToUserModelAutoMapperTypeConfigurator : IAutoMapperTypeConfigurator
    {
        public void Configure()
        {
            Mapper.CreateMap<User, GUI.Models.Blogging.User>()
                .ForMember(u => u.UserId, c => c.MapFrom(u => u.Id));
        }
    }
    

    现在您可以看到,我没有在 GUI.Models

    我用这段代码来抓取实体 精炼 的 :

    using (var unitOfWork = this.unitOfWorkFactory.Create(LockType.Read))
    {
        var allResult = blogRepository.Retrieve().Join(
            userRepository.Retrieve(),
            b => b.UserId,
            u => u.Id,
            (blog, user) =>
                Mapper.Map<GUI.Models.Blogging.Blog>(blog)
            ).GroupJoin(
                postRepository.Retrieve(),
                b => b.Id,
                p => p.BlogId,
                (blog, posts) =>
                {
                    blog.Posts = Mapper.Map<IList<GUI.Models.Blogging.Post>>(posts);
                    return blog;
                }
            );
    
    
        return View(result.ToArray());
    }
    

    如您所见 Mapper.Map 需要 List 属于 posts 通过,或 user 通过。

    我不知道怎么把这一切联系在一起。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Callum Linington    11 年前

    using块需要如下所示:

    using (var unitOfWork = this.unitOfWorkFactory.Create(LockType.Read))
    {
        var allResult = blogRepository.Retrieve().Join(
            userRepository.Retrieve(),
            b => b.UserId,
            u => u.Id,
            (blog, user) => new
                {
                    blog,
                    user
                }
            ).GroupJoin(
                postRepository.Retrieve(),
                b => b.blog.Id,
                p => p.BlogId,
                (anon, posts) => new
                {
                    anon.blog,
                    anon.user,
                    posts
                }
            );
    
        // here the allResult variable needs to get iterated by two selects
        // the first select will use automapper to map each entity into another anonymouse type
        // the second select will then put the user and posts into the blog and return the blog
    
        return View(allResults);
    }
    

    因此,第一个选择将如下所示:

    allResults.Select(x => new 
    {
        BlogDto = Mapper.Map<BlogDto>(x.blog),
        UserDto = Mapper.Map<UserDto>(x.user),
        PostDtos = Mapper.Map<IEnumerable<PostDto>(x.posts)
    });
    

    第二个选择将它们合并为一个博客:

    allResults.Select(firstSelect).Select(x => 
    {
        x.BlogDto.User = x.UserDto;
        x.BlogDto.Posts = x.PostDtos;
    
        return x.BlogDto;
    }
    

    这会给你一个 IEnumerable<BlogDto> 包含视图所需的所有信息。

    推荐文章