DTO(Data Transfer Object) + LINQ [작성중]

Eunho Bae·2022년 6월 30일
0
post-thumbnail

LINQ

    public enum ClassType
    {
        Knight,
        Archer,
        Mage
    }

    public class Player
    {
        public ClassType ClassType { get; set; }
        public int Level { get; set; }
        public int Hp {  get; set; }
        public int Attack { get; set; } 
    }

    class Program
    {
        static List<Player> _players = new List<Player>();

        static void Main(string[] args)
        {
            Random random = new Random();

            for (int i = 0; i < 100; i++)
            {
                ClassType type = ClassType.Knight;
                switch (random.Next(0, 3))
                {
                    case 0:
                        type = ClassType.Knight;
                        break;
                    case 1:
                        type = ClassType.Archer;
                        break;
                    case 2:
                        type = ClassType.Mage;
                        break;
                }

                Player player = new Player()
                {
                    ClassType = type,
                    Level = random.Next(1, 100),
                    Hp = random.Next(100, 1000),
                    Attack = random.Next(5, 50)
                };

                _players.Add(player);
            }

            // Q) 레벨이 50 이상인 Knight만 추려내서, 레벨 낮->높 순으로 정렬

            // 일반 버전
            {
                List<Player> players = GetHighLevelKnights();
                foreach (Player p in players)
                    Console.WriteLine($"{p.Level} {p.Hp}");
            }

            // LINQ 버전
            var players =
                from p in _players
                where p.ClassType == ClassType.Knight && p.Level >= 50
                orderby p.Level
                select p;

            foreach (Player p in players)
                Console.WriteLine($"{p.Level} {p.Hp}");
        }
        }

        public List<Player> GetHighLevelKnights()
        {
            ...
        }

LINQ 버전이 직접 함수를 정의하여 짠 버전보다 가독성이 좋다.

            _players
                .Where(p => p.ClassType == ClassType.Knight && p.Level >= 50)
                .OrderBy(p => p.Level)
                .Select(p => p);

그리고 위 코드에서 쿼리 명령어 부분 코드는 위와 같이 메서드로 제공이 되기 때문에 MS에서 제공하는 메서드를 잘 찾아서 사용하면 된다. (https://docs.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable?view=net-6.0)

Extensions

 public static class Extensions
    {
        // IEnumerable (LINQ to Object 또는 LINQ to XML 쿼리를 만들때 사용).
        // IQueryable (LINQ to SQL 쿼리) -> LINQ를 이용해서 DB에 접근할 때 최적화. 
        public static IQueryable<GuildDto> MapGuildToDto(this IQueryable<Guild> guild)
        {
            return guild.Select(g => new GuildDto()
            {
                Name = g.GuildName,
                MemberCount = g.Members.Count
            });
        }
    }

IEnumerable vs IQueryable

https://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet

https://jhyeok.com/ienumerable-vs-iqueryable/

profile
개인 공부 정리

0개의 댓글