![](/img/trans.png)
[英]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.