본문 바로가기

개인공부/C#

[C#] LINQ

 

■ LINQ(Language INtegrated Query)

  -  SQL문법처럼 C#에서 사용할 수 있는 질의(Query) 기능

  - 질의(Query)는 데이터 집합에서 원하는 정보를 찾는 작업

  - 질의 구성 요소

    · From : 데이터 집합

    · Where : 조건

    · Select : 항목

 

LINQ 사용

Example

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>() { 100, 200, 300, 400, 500 };

            var result = from num in list
                         where num >= 200
                         select num;

            foreach(var num in result)
                Console.WriteLine($"200 이상 값 :  {num}");
        }
    }
}

 

Example 결과

 

 

Group by

  - 데이터 정렬

  - ascending(오름차순), descending(내림차순)

  -  생략할 경우 기본값 ascending(오름차순) 적용

 

 Example

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqExample
{
    class User
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<User> users = new List<User>() 
            {  
                new User() { id = 10, name = "홍길동"},
                new User() { id = 20, name = "이순신"},
                new User() { id = 30, name = "장보고"},
                new User() { id = 40, name = "유관순"},
                new User() { id = 50, name = "장영실"},
            };

            var result = from user in users
                         where user.id > 20
                         orderby user.id descending
                         select user;

            foreach(var user in result)
                Console.WriteLine($"[내림차순 적용]  id : {user.id}, name : {user.name}");
        }
    }
}

 

Example 결과

 

 

Join

  - 두 데이터 원본을 연결하는 연산

  - 데이터 원본의 특정 필드가 일치하는 데이터로 연결

  - 내부 조인 : 두 데이터 원본의 일치하는 데이터만 반환(교집합)

  - 외부 조인 : 한쪽 데이터 원본을 기준으로 결합한 데이터만 반환

 

 내부 조인 사용

 

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqExample
{
    class Group
    {
        public string Name { get; set; }
        public int userID { get; set; }
    }
    class User
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Group> groups = new List<Group>()
            {
                new Group() {Name = "A", userID = 10},
                new Group() {Name = "A", userID = 20},
                new Group() {Name = "B", userID = 30},
                new Group() {Name = "B", userID = 40}
            };

            List<User> users = new List<User>() 
            {  
                new User() { id = 10, name = "홍길동"},
                new User() { id = 20, name = "이순신"},
                new User() { id = 30, name = "장보고"},
                new User() { id = 40, name = "유관순"},
                new User() { id = 50, name = "장영실"},
            };

            var result = from usr in users
                         join grp in groups
                         on usr.id equals grp.userID                         
                         select new
                         { 
                            GroupName = grp.Name,
                            id = usr.id,
                            name = usr.name
                         };

            foreach(var item in result)
                Console.WriteLine($"[result 결과] GroupName : {item.GroupName}, id : {item.id}, name : {item.name}");
        }
    }
}

 

 

Example 결과

 

 

 외부 조인 사용

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqExample
{
    class Group
    {
        public string Name { get; set; }
        public int userID { get; set; }
    }
    class User
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Group> groups = new List<Group>()
            {
                new Group() {Name = "A", userID = 10},
                new Group() {Name = "A", userID = 20},
                new Group() {Name = "B", userID = 30},
                new Group() {Name = "B", userID = 40}
            };

            List<User> users = new List<User>() 
            {  
                new User() { id = 10, name = "홍길동"},
                new User() { id = 20, name = "이순신"},
                new User() { id = 30, name = "장보고"},
                new User() { id = 40, name = "유관순"},
                new User() { id = 50, name = "장영실"},
            };

            var result = from usr in users
                         join grp in groups
                         on usr.id equals grp.userID into GrpUsrs
                         from grpusr in GrpUsrs.DefaultIfEmpty (
                             new Group() { Name = "무소속"})
                         select new
                         { 
                            GroupName = grpusr.Name,
                            id = usr.id,
                            name = usr.name
                         };

            foreach(var item in result)
                Console.WriteLine($"[result 결과] GroupName : {item.GroupName}, " +
                    $"id : {item.id}, name : {item.name}");
        }
    }
}

 

Example 결과

 

'개인공부 > C#' 카테고리의 다른 글

[C#] Func, Action 대리자  (0) 2023.02.17
[C#] 람다식(Lambda Expression)  (0) 2023.02.17
[C#] 대리자(Delegate), 이벤트(Event) 차이점  (0) 2023.02.15
[C#] 이벤트(Event)  (0) 2023.02.14
[C#] 대리자(Delegate)  (0) 2022.10.13