ObjectContext.ExecuteStoreQuery是否对结果集进行迭代

本文关键字:迭代 结果 ExecuteStoreQuery 是否 ObjectContext | 更新日期: 2023-09-27 18:29:21

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

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

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

我尝试了两种选择,"似乎"它们需要相同的时间(没有衡量)。我的问题是,ObjectContext.ExecuteStoreQuery是否会像我手动使用DataReader那样迭代结果集?

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

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

ObjectContext.ExecuteStoreQuery是否对结果集进行迭代

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是实体SQL表达式,你显然查询了EDM,我认为这就是你使用EF的原因。

希望这能帮助

如果你的意思是,它在每次迭代中都会进入数据库,那么(根据文档)不会,它会将整个结果集加载到你的实体中。加载后,它将遍历内存中存储的数据,尽管