Благодаря отложенному выполнению база данных фактически не запрашивается до тех пор, пока не начнется проход по результатам. Чтобы выполнить запрос немедленно, используйте ToList()
var cars = Context.Cars.Where(x=>x.Color == "Yellow").ToList();
Поскольку запросы не выполняются до их запуска, их можно строить в нескольких строках кода. Показанный ниже пример кода делает то же самое, что и предыдущий пример:
var query = Context.Cars.AsQueryable();
query = query.Where(x=>x.Color == "Yellow");
var cars = query.ToList();
Запросы с одной записью (как в случае применения First()/FirstOrDefault()
FirstOrDefault()), а операторы создания, обновления и удаления выполняются немедленно, когда запускается метод DbContext.SaveChanges().Смешанное выполнение на клиентской и серверной сторонах
В предшествующих версиях EF Core была введена возможность смешивания выполнения на стороне сервера и на стороне клиента. Это означало, что где-то в середине оператора LINQ можно было бы вызвать функцию C# и по существу свести на нет все преимущества, описанные в предыдущем разделе. Часть до вызова функции C# выполнится на стороне сервера, но затем все результаты (в данной точке запроса) доставляются на сторону клиента и остаток запроса будет выполнен как LINQ to Objects. В итоге возможность смешанного выполнения привнесла больше проблем, нежели решила, и в выпуске EF Core 3.1 такая функциональность была изменена. Теперь выполнять на стороне клиента можно только последний узел оператора LINQ.
Сравнение отслеживаемых и неотслеживаемых запросов
При чтении информации из базы данных в экземпляр DbSet
ChangeTracker, что обычно и требуется в приложении. Как только начинается отслеживание экземпляра компонентом ChangeTracker, любые последующие обращения к базе данных за тем же самым элементом (на основе первичного ключа) будут приводить к обновлению элемента, а не к его дублированию.Однако временами из базы данных необходимо получать данные, отслеживать которые с помощью ChangeTracker
Чтобы загрузить экземпляр DbSet
ChangeTracker, добавьте к оператору LINQ вызов AsNoTracking(), который указывает EF Core о необходимости извлечения данных без их помещения в ChangeTracker. Например, для загрузки записи Car без ее добавления в ChangeTracker введите следующий код:public virtual Car? FindAsNoTracking(int id)
=> Table.AsNoTracking().FirstOrDefault(x => x.Id == id);
Преимущество показанного кода в том, что он не увеличивает нагрузку на память, но с ним связан и недостаток: дополнительные вызовы для извлечения той же самой записи Car
Car:public virtual Car? FindAsNoTracking(int id)
=> Table.AsNoTrackingWithIdentityResolution().FirstOrDefault(x => x.Id == id);
Важные функциональные средства EF Core
Многие функциональные средства из EF 6 были воспроизведены в EF Core, а с каждым выпуском добавляются новые возможности. Множество средств в EF Core усовершенствовано как с точки зрения функциональности, так и в плане производительности. В дополнение к средствам, воспроизведенным из EF 6, инфраструктура EF Core располагает многочисленными новыми возможностями, которые в предыдущей версии отсутствовали. Ниже приведены наиболее важные функциональные средства инфраструктуры EF Core (в произвольном порядке).
На заметку!
Фрагменты кода в текущем разделе взяты прямо из завершенной библиотеки доступа к даннымAutoLot, которая будет построена в следующей главе.Обработка значений, генерируемых базой данных