2011-04-07 224 views
3

首先,我使用Telerik MVC Grid来显示数据。网格期望IEnumerable被传递到他们的GridModel类中,我假定需要照顾页面,排序,过滤等。使用AutoMapper将LINQ查询结果映射到ViewModel对象

为了避免通过ajax将这些数据作为JSON传递时的循环引用,我需要映射来自我的结果EF linq查询查看模型对象... AutoMapper将成为我的首选方法,但涉及AutoMapper的唯一解决方案我遇到了非常糟糕的伤害性能问题。

我有一个返回我的视图模型类型的IEnumerable到由网格打电话给我的操作方法的存储库..

public IEnumerable<ResultViewModel> Search() 
    { 
     var person = _context.Persons; 

     //this works and is the best performance wise but could be made simpler with automapper 
     var result = person.Select(x => new ResultViewModel 
          { 
           FirstName = x.firstName, 
           LastName = x.lastName, 
           ///etc... 
          }); 

     //THIS IS SLOW but works 
     //var result = Mapper.Map<IEnumerable<Person>, IEnumerable<ResultViewModel>>(person); 

     //this does not work and errors at runtime 
     //var result = person.Select(x => Mapper.Map<Person, ResultViewModel>(x)); 

     return result; 

    } 

如何保持自己的表现,同时使用automapper把事情任何想法更轻松。我假设使用automapper的缓慢版本是由列举的person集合引起的......然后由电子网格进行解析

+0

你用'person.Select(x => Mapper.Map (x))'得到了什么错误? – smartcaveman 2011-04-07 19:09:56

+0

@smartcaveman错误是:LINQ to Entities无法识别方法....,并且此方法无法转换为商店表达式 – stephen776 2011-04-08 11:18:01

+0

这意味着'IQueryable'尚未评估。 jfar的答案应该可以工作 – smartcaveman 2011-04-08 16:19:42

回答

1

听起来像您有Select(N + 1)问题,其中每个项目循环正在加载相关属性,因此会发出另一个选择查询。

使用automapper不应该有任何性能问题。

在你进行自动映射并打破IQueryable链之前,请先尝试致电ToList()(不应该是人?)。

+0

尝试过ToList()仍然是同样的问题...我的请求需要花费大约50ms的快速方式...自动映射方式,需要700-850ms – stephen776 2011-04-07 18:59:01

+0

关闭您的上下文中的延迟加载,然后重试。 – jfar 2011-04-07 19:08:03

+0

关闭延迟加载关闭了几个hundres ms关闭响应时间,但也阻止我返回相关类的属性 – stephen776 2011-04-08 11:30:43

相关问题