[EFCore] Eager Loading / Explicit Loading / Select Loading

2022. 9. 2. 16:14·공부/EFCore
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
'공부/EFCore' 카테고리의 다른 글
  • [EFCore] SaveChanges를 호출하면 어떤 일이 일어날까
  • [EFCore] Entity State, 엔티티의 상태를 알아보자
  • [EFCore] Include VS ThenInclude
  • [EFCore] System.TypeInitializationException과 Unable to load 'sni.dll' 오류해결하기
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (237) N
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (2) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    tcp
    HTML
    EntityFramework
    coding
    유니티
    네트워크
    라즈베리파이
    java
    C#
    백준
    Python
    EFCore
    C
    코딩
    디자인패턴
    Entityfamework
    게임서버
    C언어
    자바
    unity
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[EFCore] Eager Loading / Explicit Loading / Select Loading
상단으로

티스토리툴바