Ответ
В Entity Framework Core доступ к сущностям осуществляется через свойства DbSet<T>, которые представляют коллекции, привязанные к таблицам базы данных. Основные методы и подходы:
1. Поиск по первичному ключу (Find)
Ищет в отслеживаемом контексте, затем в БД. Эффективен для поиска по ключу.
// Ищет пользователя с указанным Id
var user = await context.Users.FindAsync(userId);
2. Получение одного элемента (First, Single)
FirstOrDefaultAsync— возвращает первый элемент, удовлетворяющий условию, илиnull.SingleOrDefaultAsync— ожидает ровно один элемент; выбросит исключение, если элементов несколько.// Получить первого активного пользователя var activeUser = await context.Users .FirstOrDefaultAsync(u => u.IsActive);
// Получить пользователя по уникальному email var user = await context.Users .SingleOrDefaultAsync(u => u.Email == "test@example.com");
**3. Фильтрация и материализация (`Where`, `ToList`)**
Запросы LINQ используют отложенное выполнение. Для выполнения запроса к БД нужна материализация.
```csharp
// Получить всех администраторов
var admins = await context.Users
.Where(u => u.Role == Role.Admin)
.ToListAsync();
Ключевые практики:
- Отслеживание (Tracking): По умолчанию запросы отслеживают изменения. Для операций только на чтение используйте
AsNoTracking(). - Асинхронность: Всегда предпочитайте асинхронные методы (
...Async) для избежания блокировки потоков. - Проекции: Извлекайте только нужные поля с помощью
Selectдля повышения производительности.var userNames = await context.Users .Where(u => u.IsActive) .Select(u => u.FullName) .ToListAsync();