[英]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.