我正在使用模型工厂从请求模型中查询相关实体。 结果是来自给定实体的ViewModel。
var posts = _postRepo.GetCommunityPosts(Id); // get an iqueryable
ICollection<PostViewModel> result = await ModelFactory.PostFactory(posts, take, skip); //using the ModelFactory to create the viewmodel
public async Task<ICollection<PostViewModel>> PostFactory(IQueryable<TRDPost> posts)
{
return await posts.Select(a => new PostViewModel //the viewmodel
{
// simple properties
Created = a.Created,
Body = a.Body,
Id = a.Id,
// related viewmodels
Member = new MemberViewModel
{
// Member related stuff here
// a lot of properties and also related viewmodels here
}
}
}).ToListAsync<PostViewModel>();
拥有许多不同的工厂,所有工厂都拥有&#34;会员&#34;查看模型。这真是一个糟糕的风格,因为我有吨代码冗余。有没有办法在查询中执行一个函数,例如:
public async Task<ICollection<PostViewModel>> PostFactory(IQueryable<TRDPost> posts)
{
return await posts.Select(a => new PostViewModel //the viewmodel
{
// simple properties
Created = a.Created,
Body = a.Body,
Id = a.Id,
// related viewmodels
Member = GetMemberViewModel(a) // is this possible?
}
}).ToListAsync<PostViewModel>();
阅读了很多关于表达的内容,我尝试的都没有成功。如果你指出我正确的方向,那就太好了。
答案 0 :(得分:0)
感谢Tomas Petricek说这个值得说的话:
查询将使用的lambda表达式声明是 直截了当,因为它与任何其他C#lambda没有什么不同 表达式。查询更有趣,因为它使用了两个 扩展不同的方法。第一种方法称为 ToExpandable DLINQ Table对象周围的薄包装器。感谢这个包装 您可以使用扩展Expression的第二个名为 Invoke 的方法 用于调用lambda表达式的类,同时使其仍然可行 将查询转换为T-SQL。这是有效的,因为转换为 表达式树,包装器替换所有出现的Invoke方法 通过调用lambda表达式的表达式树并传递这些 能够将扩展查询转换为的DLINQ表达式 T-SQL。
阅读本文必须有所帮助:http://tomasp.net/blog/linq-expand.aspx/