[英]Entity Framework: ObjectContext.ExecuteStoreQuery produces detached objects
[英]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直接查询数据库,你不会有一个流,而只是一个查询过的所有对象的集合。
如果我理解正确,这不是你想要的。
如果您想以某种类似于经典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.