使用AutoMapper将LINQ查询结果映射到ViewModel对象
首先,我使用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
集合引起的......然后由电子网格进行解析
听起来像您有Select(N + 1)问题,其中每个项目循环正在加载相关属性,因此会发出另一个选择查询。
使用automapper不应该有任何性能问题。
在你进行自动映射并打破IQueryable链之前,请先尝试致电ToList()
(不应该是人?)。
尝试过ToList()仍然是同样的问题...我的请求需要花费大约50ms的快速方式...自动映射方式,需要700-850ms – stephen776 2011-04-07 18:59:01
关闭您的上下文中的延迟加载,然后重试。 – jfar 2011-04-07 19:08:03
关闭延迟加载关闭了几个hundres ms关闭响应时间,但也阻止我返回相关类的属性 – stephen776 2011-04-08 11:30:43
你用'person.Select(x => Mapper.Map(x))'得到了什么错误? –
smartcaveman
2011-04-07 19:09:56
@smartcaveman错误是:LINQ to Entities无法识别方法....,并且此方法无法转换为商店表达式 – stephen776 2011-04-08 11:18:01
这意味着'IQueryable'尚未评估。 jfar的答案应该可以工作 – smartcaveman 2011-04-08 16:19:42