我有这个代码执行通过EF EDM映射的存储过程。
meTest<MCTEntities, ObjectResult<retrieveMedia_Result>>(u => u.retrieveMedia(campaign_id: 1), ConnectionResolver.MCT_DB_Connection);
方法:
public static TValue meTest<U, TValue>(Func<U, TValue> func, String connection)
where U : ObjectContext, new()
{
using (U entitiesContext = (U)Activator.CreateInstance(typeof(U), new[] { connection }))
{
return func(entitiesContext);
}
}
问题是retrieveMedia返回ObjectResult<retrieveMedia_Result>
,这是通过延迟执行完成的,导致错误:Calling 'Read' when the data reader is closed is not a valid operation.
现在,我知道我可以调用ToList()或ToArray(),但有没有其他方法可以强制立即执行?
我不确定将ObjectResult<retrieveMedia_Result>
投射到List<retrieveMedia_Result>
是正确的做法。
答案 0 :(得分:2)
ToList和ToArray都枚举了导致查询执行的集合.AsEnumrable完成了查询构建(即你不能再向查询添加位)但是在枚举集合之前它实际上并没有执行。 / p>
在您的示例中,枚举您的集合的任何操作都将检索数据。例如foreach。
答案 1 :(得分:0)
您必须添加ToArray()
或ToList()
以防止在处置上下文时迭代结果。投射到List<T>
无济于事:甚至不可能。
如果您之后可以迭代结果,那么您可能会冒一次这样做的风险,这会引发异常。