AutoMapper在LINQ到实体GroupJoin

本文关键字:实体 GroupJoin LINQ AutoMapper | 更新日期: 2023-09-27 18:17:10

我有我的地图:

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

上映射"navigation"属性

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

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需要有postsList通过,或者user通过。

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

AutoMapper在LINQ到实体GroupJoin

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

第二次选择将把它们合并成一个blog:

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

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