То что ты описал - разные понятия.
Например, у тебя есть 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
Смысл ты понял - это разные зоны ответственности: КОГДА получать данные и КАКИЕ данные получать