참조
https://learn.microsoft.com/ko-kr/dotnet/csharp/linq/
LINQ (Language-Integrated Query)
- 다양한 데이터 원본에 대해 쿼리를 작성할 수 있는 도구
- 동일한 구문을 이용하여 모든 형식의 데이터 소스를 다룰 수 있음
→ 코드 재사용성 UP / 다양한 데이터 형식에 대한 일관된 접근 방식 제공
- 컴파일 타임에 형식 검사를 수행함
- 선언적 쿼리 구문 (SQL과 동일)
: 데이터를 쿼리할 때, 어떻게 쿼리를 수행할지를 명시하는 게 아니라 무엇을 원하는지를 설명하는 방식
- IQueryable<T> 및 IEnumerable<T> 인터페이스를 활용하여 쿼리 결과를 지연 실행함
→ 쿼리는 실제로 결과가 필요할 때까지 실행되지 않음
→ 메모리 공간 절약 / 성능 최적화
▶ 쿼리 결과를 실행해서 메모리에 할당하고 싶다면
- .ToList() 또는 .ToArray() 메서드를 이용해서 쿼리 결과를 리스트/배열로 변환하기
→ 쿼리 결과가 필요할 때 즉시 사용할 수 있음
var highScorersQuery = from student in students // students는 객체 배열
where student.Score > 90
select student;
// 이 시점에서는 쿼리가 실행되지 않음
// 실제로 결과를 필요로 할 때까지 대기
// .ToList()를 호출하면 쿼리가 실행되고 결과가 리스트로 저장됨
List<Student> highScorersList = highScorersQuery.ToList();
// 또는
var numQuery3 =
(from student in students
where student.Score > 90
select student).ToList();
LINQ 구문 종류
1) 쿼리 구문 방식
- SQL과 유사한 방식으로, 더 읽기 쉬운 형태로 작성됨
- from 절로 시작하고, select 절 또는 group 절로 끝남
- from 절을 2개 이상 포함할 수 있음
IEnumerable<int> numQuery1 =
from num in numbers // numbers 컬렉션에서 num 변수를 통해 데이터 요소에 접근
where num % 2 == 0 // 조건: num이 짝수인 경우
orderby num // 정렬: num에 따라 오름차순으로 정렬
select num; // 선택: num을 결과로 반환
2) 메서드 구문 방식
- LINQ 메서드를 체인 방식으로 호출함
IEnumerable<int> numQuery2 = numbers
.Where(num => num % 2 == 0) // 짝수 필터링
.OrderBy(n => n); // 오름차순 정렬
→ 두 방법 모두 동일한 성능을 제공함
쿼리 구문 방식
1) from 절
- 데이터 소스에서 요소를 선택함
- 여러 데이터 소스를 쿼리하는 경우 여러 개의 from 절을 사용할 수 있음
from num in numbers
2) where 절
- 데이터를 필터링함
where num % 2 == 0
3) orderby 절
- 쿼리 결과를 정렬함
- 기본값 : 오름차순
orderby num // 오름차순
orderby num descending // 내림차순
4) select 절
- 최종적으로 반환할 데이터를 지정함
select num
- '익명 형식'을 사용하여 객체를 반환할 수 있음
select new { o.OrderID, e.FirstName }
5) join 절
- 여러 데이터 원본을 결합할 때 사용함
from student in students
join score in scores on student.Id equals score.StudentId
6) group by 절
// student를 Gender 기준으로 그룹화하고, 이 결과를 genderGroup로 참조함
group student by student.Gender into genderGroup
select new
{
Gender = genderGroup.Key, // 그룹의 key (그룹화 기준)
Count = genderGroup.Count() // 그룹 내 데이터 수
};
7) let 절
- 변수에 값을 할당하고, 이 값을 쿼리 내에서 재사용할 수 있도록 함
- from 절이나 where 절 다음에 사용할 수 있음
from student in students
let age = student.Age
where age > 21
select new { student.Name, student.Age };
메서드 구문 방식
1) Where
var adultStudents = students.Where(student => student.Age >= 21);
2) Select
var studentNames = students.Select(student => student.Name);
3) OrderBy / OrderByDescending
var sortedStudents = students.OrderBy(student => student.Age); // 오름차순
var sortedStudentsDescending = students.OrderByDescending(student => student.Age); // 내림차순
4) GroupBy
var groupedByGender = students.GroupBy(student => student.Gender);
5) Join
var scores = new List<Score>
{
new Score { StudentId = 1, Value = 85 },
new Score { StudentId = 2, Value = 90 }
};
var studentScores = students.Join(scores,
student => student.Id,
score => score.StudentId,
(student, score) => new { student.Name, score.Value });
6) Distinct
- 중복 제거
var distinctGenders = students.Select(student => student.Gender).Distinct();
'C#' 카테고리의 다른 글
[C#/dotnet] 페이지 구조 - 마스터 페이지 & 콘텐츠 페이지 (1) | 2024.10.24 |
---|---|
[C#/dotnet] 페이지 수명 주기 (3) | 2024.10.24 |
[C#/dotnet] 제네릭 (Generics) (0) | 2024.10.23 |
[C#/dotnet] 일반적인 C# 코드 규칙 (2) | 2024.10.23 |
[C#/dotnet] 식별자 명명 규칙 (0) | 2024.10.18 |