ObjectContext.ExecuteStoreQuery是否迭代结果集?

时间:2012-03-27 16:48:54

标签: c# entity-framework

我使用ObjectContext.ExecuteStoreQuery返回实体列表,大约30K。

我需要提高性能,因此我将“选择”我真正需要的4个属性,而不是总共20个属性。

我可以使用这4个属性创建一个DTO并将其传递给ObjectContext.ExecuteStoreQuery,但我更喜欢使用DataReader,迭代30K,并构建我的列表。

我尝试了两种选择,“看起来”他们需要同时(没有测量它)。我的问题是-does ObjectContext.ExecuteStoreQuery遍历结果集,因为我是用DataReader手动完成的?

我在MSDN中发现了这个,但并没有真正回答我的问题。谢谢。

  

调用ExecuteStoreQuery方法相当于调用   DbCommand类的ExecuteReader方法,只有ExecuteStoreQuery   返回实体,ExecuteReader返回属性值   DbDataReader。

2 个答案:

答案 0 :(得分:1)

如果您的意思是,它是否在每次迭代时都会访问数据库,那么(通过文档)不会将整个结果集加载到您的实体中。加载后,它将遍历内存中存储的数据,但

答案 1 :(得分:1)

ExecuteStoreQuery返回 System.Data.Objects.ObjectResult ,并使用TSQL直接查询数据库,您将不会有一个流,只会查询所有查询对象的集合。

http://blogs.msdn.com/b/alexj/archive/2009/11/07/tip-41-how-to-execute-t-sql-directly-against-the-database.aspx

如果我理解正确,这不是你想要的。

如果您想以某种类似于经典ADO.NET DataReader的方式查询数据,您应该直接查询 EntityClient ,这与使用Linq To Entities或ESQL不同,因为您没有传递ObjectContext,查询不会实现任何对象!

using (EntityConnection conn = new EntityConnection("name=SampleEntities"))
{
    conn.Open();
    EntityCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT VALUE c FROM SampleEntities.Contacts AS c WHERE c.FirstName='Robert'";
    using (EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection))
    {
        while (rdr.Read())
        {
            var firstname = rdr.GetString(1);
            var lastname = rdr.GetString(2);
        }
    }
    conn.Close();
}

如果您只需要以某种方式查询需要显示的某些只读数据,这有助于创建任何其他提供程序命令并设置其CommandText,但此处的CommandText是Entity SQL表达式,您显然在查询EDM,我认为这就是您使用EF的原因。

希望这有帮助