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
我使用这段代码抓取实体精炼:
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)
});
第二次选择将把它们合并成一个blog:
allResults.Select(firstSelect).Select(x =>
{
x.BlogDto.User = x.UserDto;
x.BlogDto.Posts = x.PostDtos;
return x.BlogDto;
}
这将给你一个IEnumerable<BlogDto>
,其中包含视图所需的所有信息。