繁体   English   中英

ObjectContext.ExecuteStoreQuery是否迭代结果集?

[英]Does ObjectContext.ExecuteStoreQuery iterate over the result set?

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

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

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

我尝试了两种选择,它“似乎”它们需要同时(没有测量它)。 我的问题是-does ObjectContext.ExecuteStoreQuery迭代结果集,因为我正在用DataReader手动完成?

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

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

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

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的原因。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM