[C#] LINQ

Yijun Jeon·2023년 9월 20일
0

C#

목록 보기
3/7
post-thumbnail

[이것이 C#이다] 15장 LINQ

LINQ

LINQ (Language INtegrated Query) : 데이터 질의 기능

  • From : 어떤 데이터 집합에서 찾을 것인가?
  • Where : 어떤 값의 데이터를 찾을 것인가?
  • Select : 어떤 항목을 추출할 것인가?

LINQ 기본

from

모든 LINQ 쿼리식은 반드시 from 절로 시작

⭐️ 기본 형식

from <범위 변수> in <데이터 원본>
  • 데이터 원본 : IEnumerable<T> 인터페이스 상속하는 형식이어야 함

🔗 사용 예

int[] numbers = {1,2,3,4,5,6,7,8,9,10};

var result = from n in numbers
			 where n%2 == 0
             orderby n
             select n;

where

where : 필터 역할을 하는 연산자로, 범위 변수가 가져야 하는 조건을 인수로 입력

orderby

orderby : 데이터의 정렬을 수행하는 연산자

  • 오름차순 - default, ascending
  • 내림차순 - descending

🔗 사용 예

int[] numbers = {1,2,3,4,5,6,7,8,9,10};

var result = from n in numbers
			 where n%2 == 0
             orderby n descending
             select n;

select

select : 최종 결과를 추출하는 쿼리식의 마침표
-> 결과는 IEnumerable<T>로 반환

무명 형식을 이용해서 새로운 형식을 즉석에서 만들어낼 수도 있음

🔗 사용 예

var profiles = from profile in arrProfile
			   where profile.Height < 175
               orderby profile.Height
               select new (Name = profile.Name, InchHeight = profile.Height * 0.393);

여러 데이터 원본 접근

from 문을 중첩해서 사용

🔗 사용 예

class Class
{
	public string Name { get; set; }
	public int[] Score { get; set; }
}

var classes = from c in arrClass
                from s in c.Score
                where s < 60
              orderby s
              select new { c.Name, Lowest = s };

group by

group by : 특정 기준에 따라 나누어 그룹화

⭐️ 기본 형식

group A by B into C
  • A : 범위 변수
  • B : 분류 기준
  • C : 그룹 변수

🔗 사용 예

class Profile
{
    public string Name { get; set; }
    public int Height { get; set; }
}

var listProfile = from profile in arrProfile
                    orderby profile.Height
                    group profile by profile.Height < 175 into g
                    select new { GroupKey = g.Key, Profils = g };
  • Group : IGrouping<T> 형식
  • g.key : true || false

join

join : 두 데이터 원본을 연결하는 연산
-> 각 데이터 원본에서 특정 필드의 값을 비교하여 일치하는 데이터끼리 연결

내부 조인

Inner join : 교집합과 비슷

첫 번째 원본 데이터를 기준으로, 두 데이터 원본의 특정 필드를 비교해서 일치하는 데이터를 반환

  • 기준 데이터 원본 O, 연결 데이터 원본 O -> O
  • 기준 데이터 원본 O, 연결 데이터 원본 X -> X
  • 기준 데이터 원본 X, 연결 데이터 원본 O -> X

⭐️ 기본 형식

from a in A
join b in B on a.XXXX equals b.YYYY
  • on 키워드 : 조인 조건 - 동등(Equlity)만 허용

🔗 사용 예

class Profile
{
    public string Name { get; set; }
    public int Height { get; set; }
}

class Product
{
    public string Title { get; set; }
    public string Star { get; set; }
}

var listProfile = from profile in arrProfile
                    join product in arrProduct on profile.Name equals product.Star
                    select new
                    {
                        Name = profile.Name,
                        Work = product.Title,
                        Height = profile.Height
                    };

외부 조인

Inner join : 조인 결과에 기준이 되는 데이터 원본이 모두 포함됨

  • 기준 데이터 원본 O, 연결 데이터 원본 X -> 빈 값

빈 값은 임시 컬렉션의 DefaultIfEmpty 연산을 통해 임의 값으로 채울 수 있음

⭐️ 기본 형식

from a in A
join b in B on a.XXXX equals b.YYYY into ps

🔗 사용 예

listProfile = from profile in arrProfile
                join product in arrProduct on profile.Name equals product.Star into ps
                from product in ps.DefaultIfEmpty(new Product() { Title = "그런 거 없음" })
                select new
                {
                    Name = profile.Name,
                    Work = product.Title,
                    Height = profile.Height
                };

LINQ 표준 연산자

🔗 사용 예

double Average = (from profile in arrProfile
				  where profile.Height < 180
                  select profile).Average(profile => profile.Height);

0개의 댓글