[이것이 C#이다] 15장 LINQ
LINQ (Language INtegrated Query)
: 데이터 질의 기능
모든 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 : 필터 역할을 하는 연산자로, 범위 변수가 가져야 하는 조건을 인수로 입력
orderby : 데이터의 정렬을 수행하는 연산자
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 : 최종 결과를 추출하는 쿼리식의 마침표
-> 결과는 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 A by B into 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 };
IGrouping<T>
형식join
: 두 데이터 원본을 연결하는 연산
-> 각 데이터 원본에서 특정 필드의 값을 비교하여 일치하는 데이터끼리 연결
Inner join
: 교집합과 비슷
첫 번째 원본 데이터를 기준으로, 두 데이터 원본의 특정 필드를 비교해서 일치하는 데이터를 반환
⭐️ 기본 형식
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
: 조인 결과에 기준이 되는 데이터 원본이 모두 포함됨
빈 값은 임시 컬렉션의
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
};
🔗 사용 예
double Average = (from profile in arrProfile
where profile.Height < 180
select profile).Average(profile => profile.Height);