У меня есть длительный процесс, который интегрируется через коллекцию входящих сущностей, чтобы определить, отличается ли входящая сущность от сущности в постоянном хранилище.
Когда я впервые написал это, я извлек каждую сущность из базы данных, которая соответствовала сущности, с которой я сравнивал, у меня также было несколько включений, чтобы получить ссылочные сущности, которые мне также нужно было сравнить. Это было невероятно медленно, потому что каждое сравнение включало запрос к базе данных, а затем Entity Framework «исправлялся».
Сейчас я использую запрос, чтобы получить все сущности, которые мне нужны для моих сравнений, прежде чем я начну процесс. Это позволяет мне заранее оценить скорость, чтобы я мог значительно ускорить процесс. Однако первоначальный запрос по-прежнему занимает не менее минуты или двух.
Dictionary<long, SomeEntity> someEntities = new SomeEntitiesInclude().ApplyTo(context.SomeEntities)
.Where(se => se.SomeRelatedEntity.ID == relatedEntityID)
.Where(se => se.SCDCurrent == true)
.OrderBy<SomeEntity, long>(se => se.SomeRelatedEntity.ID)
.ToDictionary<SomeEntity, long>(se => se.SomeRelatedEntity.ID);
Фактический sql-запрос, полученный из этого, занимает всего пару секунд, поэтому я думаю, что большую часть времени тратится на исправление, чтобы контекст мог отслеживать изменения.
Объект SomeEntitiesInclude позволяет мне использовать строго типизированные операторы include и является подклассом класса IncludeStratergy, разработанного Алексом Джеймсом: http://blogs.msdn.com/alexj/archive/2009/07/25/tip-28-how-to-implement-include-strategies.aspx
У кого-нибудь есть советы, чтобы ускорить выполнение этого?
Извиняюсь за длинный вопрос.
Джеймс