ObjectContext.ExecuteStoreQuery выполняет итерацию по набору результатов? - PullRequest
0 голосов
/ 27 марта 2012

Я использую ObjectContext.ExecuteStoreQuery для возврата списка сущностей размером около 30 КБ.

Мне нужно улучшить производительность, поэтому я буду "выбирать" 4 свойства, которые мне действительно нужны, вместо общего количества 20 свойств.

Я мог бы создать DTO с этими 4 свойствами и передать его в ObjectContext.ExecuteStoreQuery, но я бы предпочел использовать DataReader, перебрать 30K и построить свой список.

Я попробовал оба варианта, и, кажется, они занимают одно и то же время (не измерял) Мой вопрос -Объект ObjectContext.ExecuteStoreQuery повторяется по набору результатов, как я делаю вручную с DataReader?

Я нашел это в MSDN, но на самом деле не ответил на мой вопрос. Спасибо.

Вызов метода ExecuteStoreQuery эквивалентен вызову Метод ExecuteReader класса DbCommand, только ExecuteStoreQuery возвращает сущности, а ExecuteReader возвращает значения свойств в DbDataReader.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

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.

Надеюсь, это поможет

1 голос
/ 27 марта 2012

Если вы имеете в виду, попадает ли он в базу данных на каждой итерации, то (следуя документации) нет, он загружает весь набор результатов в вашу сущность.После загрузки он будет перебирать сохраненные данные в памяти, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...