728x90
✅ Eager Loading
public static void EagerLoading()
{
Console.WriteLine("길드 이름을 입력하세요");
Console.Write("> ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
Guild guild = db.Guilds.AsNoTracking()
.Where(g => g.GuildName == name)
.Include(g => g.Members)
.ThenInclude(p => p.Item)
.First();
foreach (Player player in guild.Members)
{
Console.WriteLine($"TemplateId({player.Item.TemplateId}) Owner({player.Name})");
}
}
}
사용자에게 길드 이름을 얻어 그 이름으로 멤버 정보를 얻고, 그 멤버가 가진 아이템 정보를 가져오는 함수다.
Inlcude, ThenInclude를 사용하여 필요한 정보를 얻을 수 있다. DB 접근 한 번만으로 모든 정보를 로딩할 수 있다는 것이 장점이자 단점이다.
✅ Explicit Loading
public static void ExplicitLoading()
{
Console.WriteLine("길드 이름을 입력하세요");
Console.Write("> ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
Guild guild = db.Guilds
.Where(g => g.GuildName == name)
.First();
// 명시적
db.Entry(guild).Collection(g => g.Members).Load(); // 길드원은 여럿이니까 Collection
foreach (Player player in guild.Members)
{
db.Entry(player).Reference(p => p.Item).Load(); // 아이템은 하나니까 Reference
}
foreach (Player player in guild.Members)
{
Console.WriteLine($"TemplateId({player.Item.TemplateId}) Owner({player.Name})");
}
}
}
Eager Loading과 마찬가지로 사용자에게 길드 이름을 얻고 길드 멤버의 아이템 정보를 가져오는 함수다.
Explicit Loading은 한 단계, 한 단계 우리가 직접 코드를 작정하여 DB에 접근한 뒤 정보를 뽑아올 수 있다.
필요한 시점에 필요한 정보만을 로딩할 수 있다는 장점이 있지만, DB 접근 비용이 높다는 단점이 있다.
✅ Select Loading
public static void SelectLoading()
{
Console.WriteLine("길드 이름을 입력하세요");
Console.Write("> ");
string name = Console.ReadLine();
using (var db = new AppDbContext())
{
var info = db.Guilds
.Where(g => g.GuildName == name)
.Select(g => new
{
Name = g.GuildName,
MemberCount = g.Members.Count
})
.First();
Console.WriteLine($"GuildName ({info.Name}), MemberCount({info.MemberCount})");
}
}
위 두 함수와 내용이 다르다. 특정 길드에 있는 멤버의 수를 알아보는 함수다.
Select를 사용해 원하는 정보를 가져올 수 있다. 필요한 정보만을 골라서 볼 수 있다는 장점이 있지만, 정보를 뽑아오고 싶을 때마다 일일이 Select를 해주어야 한다는 단점이 있다.
728x90
'공부 > EFCore' 카테고리의 다른 글
[EFCore] DB에 이미 존재하는 사용자를 PK로 연결하려면? (0) | 2022.09.04 |
---|---|
[EFCore] SaveChanges를 호출하면 어떤 일이 일어날까 (0) | 2022.09.04 |
[EFCore] Entity State, 엔티티의 상태를 알아보자 (0) | 2022.09.04 |
[EFCore] Include VS ThenInclude (0) | 2022.09.02 |
[EFCore] System.TypeInitializationException과 Unable to load 'sni.dll' 오류해결하기 (0) | 2022.09.01 |