簡體   English   中英

LINQ to Entities Group中的AutoMapper

[英]AutoMapper in LINQ to Entities GroupJoin

所以我有我的地圖:

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上映射“導航”屬性。

我正在使用此代碼來獲取Refined實體:

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需要具有傳遞的posts List或傳遞的user

我不確定如何將所有這些結合在一起。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM