立即执行EF

时间:2012-09-23 17:51:57

标签: c# linq entity-framework lambda

我有这个代码执行通过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>是正确的做法。

2 个答案:

答案 0 :(得分:2)

ToList和ToArray都枚举了导致查询执行的集合.AsEnumrable完成了查询构建(即你不能再向查询添加位)但是在枚举集合之前它实际上并没有执行。 / p>

在您的示例中,枚举您的集合的任何操作都将检索数据。例如foreach。

答案 1 :(得分:0)

您必须添加ToArray()ToList()以防止在处置上下文时迭代结果。投射到List<T>无济于事:甚至不可能。

如果您之后可以迭代结果,那么您可能会冒一次这样做的风险,这会引发异常。