ASP MVC Lambda表达式或查询扩展?

时间:2014-12-14 21:40:17

标签: sql asp.net-mvc linq expression

我正在使用模型工厂从请求模型中查询相关实体。 结果是来自给定实体的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>();

阅读了很多关于表达的内容,我尝试的都没有成功。如果你指出我正确的方向,那就太好了。

1 个答案:

答案 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/