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。
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的原因。
希望这能帮助
如果你的意思是,它在每次迭代中都会进入数据库,那么(根据文档)不会,它会将整个结果集加载到你的实体中。加载后,它将遍历内存中存储的数据,尽管