LINQ to Entities GroupJoin中的AutoMapper

时间:2014-08-09 13:31:34

标签: c# linq entity-framework automapper

所以我有我的地图:

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

现在,您可以看到我没有映射&#34;导航&#34; 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 个答案:

答案 0 :(得分:0)

使用块需要如下所示:

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>,其中包含视图所需的所有信息。