我有以下代码从客户表中检索数据
var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList();
mapper函数将实体对象映射到业务对象,它看起来像这样
internal static Customer Map(CustomerEntity entity) { if (entity == null) return null; return new Customer { Id = entity.Id,Name = entity.Name,Addresses = Map(entity.Addresses) }; }
现在,上面的代码运行良好.
但是,当我尝试这样做时:
var customers= context.CustomerEntities.Select(Mapper.Map).ToList();
我收到错误消息:已经有一个打开的DataReader与此命令关联,首先必须关闭Mapper函数执行时.
现在我知道要解决这个问题,我必须在我的连接字符串中设置multipleactiveresultsets = True.我已经尝试了,它解决了我的问题.
但是,当我运行sql分析器时,从实体框架查询所有客户端,即使我不需要,也自动检索所有的地址.
除了设置multipleactiveresultsets = True之外,还有解决方法吗?我不希望地址被懒惰加载所有的时间.
解决方法
我相信这是因为每个客户的select语句都会导致再次读取数据.为什么不先做ToList(),然后应用映射(选择),如:
var customers= context.CustomerEntities.ToList().Select(Mapper.Map);
我相信这将首先提供数据,然后做映射,你不会有这个问题.