@returnZero

В чём принципиальное отличие Eager/Explicit Loading от прямого использования Join-ов через LINQ в контексте EF Core?

Как я понимаю - есть три стратегии загрузки связанных данных - Eager/Explicit/Lazy Loading, но ведь ещё есть LINQ Select/SelectMany/GroupMany... методы для ручного построения JOIN-ов.

Что и в каких случаях лучше использовать ?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
То что ты описал - разные понятия.

Например, у тебя есть one-to-many и это представляется списком (ICollection).
class User
{
     public string Name { get; set; }
     public ICollection<Subscription> Subscriptions { get; set; }
}


Eager/Explicit/Lazy Loading

Это КОГДА ты данные будешь получать.

Тогда действия будут следующими:
- Eager - не важно нужны тебе эти данные или нет - они все равно будут загружены. Тут ты сразу получишь все подписки (Subscriptions) даже если тебе просто нужно узнать Name
- Lazy - они будут загружены, только когда обратишься к этому полю, т.е. в момент обращения к полю Subscriptions
- Explicit - это стратегия когда ты сначала подгружаешь объекты в DbContext, а потом (в будущем) когда понадобятся загрузить из памяти - без сетевых запросов. Это уже про метод Load() у DbContext.

Select/SelectMany/GroupMany

Это ЧТО ты хочешь получить

Пример все тот же:
- Select - например, тебе нужно получить только имена, тогда ты создаешь анонимные объекты:
context.Users.Select(u => new { u.Name });
- SelectMany - тебе нужен только список подписок всех пользователей из списка
context.Users.Where(u => someIds.Contains(u.Id)).SelectMany(u => u.Subscriptions); // Не уверен что запрос корректный

- GroupBy - это уже JOIN

Смысл ты понял - это разные зоны ответственности: КОГДА получать данные и КАКИЕ данные получать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы