Проекция Entity Framework в класс быстрее, чем выбор объектов EF POCO, ПОЧЕМУ? - PullRequest
2 голосов
/ 28 сентября 2011

Это меня смущает.

Я использую EF 4.1 и применил шаблон T4 к модели для использования прокси POCO и POCO (общедоступный ctor без параметров, все свойства виртуальные, все свойства навигации - ICollection).

У меня есть таблица с 1,1M записями. Я проводил некоторые временные тесты, чтобы выяснить, сколько времени потребуется, чтобы получить эти данные и получить неожиданные результаты.

Этот вызов возвращается примерно через 21 секунду:

ctx.Valuations.MergeOption = MergeOption.NoTracking
var entityValuations = ctx.Valuations.OfType<Foo>().ToArray();

Этот вызов занимает 9 секунд:

ctx.Valuations.MergeOption = MergeOption.NoTracking
var entityValuations = ctx.Valuations.OfType<Foo>().Select(v => new Val()
{
    ID = v.ID
    ...
    //set all properties
    ....
}).ToArray();

Единственное различие между этими двумя утверждениями состоит в том, что первый возвращает прокси-серверы EF, а второй проецирует набор результатов в не-прокси-сервер. Вот такая огромная разница во времени исполнения! Я совершенно озадачен тем, почему, и не могу придумать какой-либо законной причины.

Кто-нибудь знает, почему второе утверждение намного быстрее?

1 Ответ

4 голосов
/ 28 сентября 2011

POCO прокси - это просто прокси. Новый прокси-класс должен быть создан для каждого и добавлен в контекст. Хотя вы, по сути, сказали «не отслеживать их в контексте», я думаю, что это будет немного быстрее, но я думаю, что вы создаете дополнительные объекты 1.1M, которые являются прокси.

Примечание от: http://msdn.microsoft.com/en-us/library/dd456853.aspx

» Вы можете иметь смесь объектов POCO и объектов-посредников. Чтобы отключить создание прокси-объектов, задайте для свойства ProxyCreationEnabled значение false для экземпляра ObjectContextOptions, которое возвращается свойством ContextOptions в ObjectContext: «

Было бы интересным тестом отключить прокси в контексте через ProxyCreationEnabled и посмотреть, каков ваш результат - я бы собрал аналогичное.

...