Каковы рекомендации по производительности, которые должен знать каждый разработчик ADO.NET EF?
Пожалуйста, поместите каждый совет на каждый ответ и объясните, почему отзыв хорош (например, минимизируя округление DB).
Каковы рекомендации по производительности, которые должен знать каждый разработчик ADO.NET EF?
Пожалуйста, поместите каждый совет на каждый ответ и объясните, почему отзыв хорош (например, минимизируя округление DB).
Используйте ObjectContext#GetObjectByKey() для извлечения объектов по их ключу вместо использования оператора First() (или FirstOrDefault) в запросе LINQ. Последний будет попадать в базу данных каждый раз, в то время как первый сначала будет искать кеш EF (ObjectStateManager для конкретной) для объекта и не будет попадать в базу данных, если найден объект с указанным ключом.
Ссылки
То, что я только что узнал при профилировании SQL, сгенерированных кодом EF, используемым в моем приложении: есть разница между:
IEnumerable<User> users = DB.User.Where(...);
int count = users.Count();
и
IQueryable<User> users = DB.User.Where(...);
int count = users.Count();
Первый генерирует полный запрос для извлечения сопоставленных строк из таблицы User, и подсчет выполняется после того, как данные были возвращены в EF. Последний делает то, что обычно ожидается: сгенерируйте SELECT COUNT ... SQL, который намного эффективнее.
Это довольно тонко, но не сложно понять, почему, заметив об этом: это связано с статически связанной природой метода расширения С#.
Небольшой способ обойти это - использовать ключевое слово "var" для объявления переменной:
var users = DB.users.Where(...);
int count = users.Count();
Это приведет к объявлению "пользователей" как того же типа, который возвращает ".Where"; который является IQueryable < > .
Предположим, что BlogPost сущность ссылается на объект User через свойство Author. Вместо указания полного объекта User на свойство BlogPost.Author (для которого может потребоваться обращение к базе данных), инициализируя ссылку правильной EntityKey. Например:
BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId);
Быстрый и простой способ обновления отдельных объектов объекта. Это метод расширения.
public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached)
{
if (objectDetached.EntityState == EntityState.Detached)
{
object original;
if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original))
obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
else
throw new ObjectNotFoundException();
}
}