簡體   English   中英

ObjectContext.ExecuteStoreQuery是否迭代結果集?

[英]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直接查詢數據庫,你不會有一個流,而只是一個查詢過的所有對象的集合。

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是Entity SQL表達式,您顯然在查詢EDM,我認為這就是你使用EF的原因。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM