我使用ObjectContext.ExecuteStoreQuery返回实体列表,大约30K。
我需要提高性能,因此我将“选择”我真正需要的4个属性,而不是总共20个属性。
我可以使用这4个属性创建一个DTO并将其传递给ObjectContext.ExecuteStoreQuery,但我更喜欢使用DataReader,迭代30K,并构建我的列表。
我尝试了两种选择,“看起来”他们需要同时(没有测量它)。我的问题是-does ObjectContext.ExecuteStoreQuery遍历结果集,因为我是用DataReader手动完成的?
我在MSDN中发现了这个,但并没有真正回答我的问题。谢谢。
调用ExecuteStoreQuery方法相当于调用 DbCommand类的ExecuteReader方法,只有ExecuteStoreQuery 返回实体,ExecuteReader返回属性值 DbDataReader。
答案 0 :(得分:1)
如果您的意思是,它是否在每次迭代时都会访问数据库,那么(通过文档)不会将整个结果集加载到您的实体中。加载后,它将遍历内存中存储的数据,但
答案 1 :(得分:1)
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的原因。
希望这有帮助