У меня есть еще один вопрос о производительности с EF.Производительность с платформой Entity
Там один способ получить объект из контекста:
tDocumentTyp DocumentTypObject = Context.tDocumentTyps.Where(s => s.DocumentTypID == iTypID).FirstOrDefault();
Этот метод занимает ~ 2979 мс.
Тогда я написал метод, чтобы получить DBSet с помощью отражения и выполняется таким образом:
tDocumentTyp DocumentTypObject = Context.GetEntries<tDocumentTyp>().Where(s => s.DocumentTypID == iTypID).FirstOrDefault();
Мой метод нуждается в ~ 222 мс для выполнения.
Итак, теперь мой вопрос: почему мой метод намного быстрее первоначального? Или что-то не так с моим методом?
Чтобы сделать это немного легче, вот мой метод для получения DBSet с помощью отражения:
public static IEnumerable<T> GetEntries<T>(this AppContext DataContext,
string PropertyName = null, IEnumerable<string> includes = null) where T : IEntity
{
Type ContextType = typeof(AppContext);
PropertyInfo Entity = null;
if (null == PropertyName)
Entity = ContextType.GetProperty(typeof(T).Name)
?? ContextType.GetProperty(typeof(T).Name + "s");
else
Entity = ContextType.GetProperty(PropertyName);
if (null == Entity)
throw new Exception("Could not find the property. If the property is not equal to the tablesname, you have to parametrize it.");
DbQuery<T> set = ((DbSet<T>)Entity.GetValue(DataContext, null));
if (includes != null)
includes.ForEach(f => set = set.Include(f));
return set;
}
EF - это ОРМ. Он генерирует и выполняет SQL-инструкции. Где создаются запросы? Имеет ли базовая таблица индексы? Вы даже получаете одинаковые результаты? Как вы оценили код? Ваш метод возвращает запрос в IEnumerable, который должен * выполнить * запрос. –
Эй, да, у меня такие же результаты. Я могу изменять значения через контекст и сохранять и все нормально на данный момент ... нет индексов –
Нет индексов означает, что серверу придется искать * все * строки, чтобы найти совпадение. Тем не менее, вы все еще не размещали * SQL-запросы, созданные. Вы не можете устранить неисправность SQL, если не знаете, что выполняется, и против чего - сколько строк? Как вы подключаетесь к базе данных? Как вы используете код? Например, вы можете часто считывать кешированные значения, думая, что каким-то образом метод secod работает быстрее. Повторно ли вы используете один и тот же контекст в тестах? –