[C#/dotnet] LINQ (Language-Integrated Query)

2024. 10. 23. 14:19·C#
728x90
728x90

참조

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();

 

 

320x100
반응형
저작자표시 비영리 변경금지 (새창열림)

'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
'C#' 카테고리의 다른 글
  • [C#/dotnet] 페이지 수명 주기
  • [C#/dotnet] 제네릭 (Generics)
  • [C#/dotnet] 일반적인 C# 코드 규칙
  • [C#/dotnet] 식별자 명명 규칙
스응
스응
    반응형
    250x250
  • 스응
    이서영의 개발 블로그
    스응
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (385)
      • Java (134)
        • Base (54)
        • Spring Boot (37)
        • JSP (16)
        • Swing (GUI) (20)
        • Design Pattern (7)
      • C# (13)
      • PHP (18)
      • SQL (27)
      • Vue.js (9)
      • Tailwind CSS (4)
      • TypeScript (7)
      • HTML & CSS (27)
      • JavaScript (26)
      • jQuery (10)
      • Android (3)
      • - - - - - - - - - - - - - - (0)
      • Hotkeys (5)
      • CS (30)
      • IT Notes (13)
      • Error Notes (17)
      • Team Project (24)
        • Airlines Web Project (12)
        • University Web Project (6)
        • Strikers 1945 GUI Project (6)
      • My Project (18)
        • Library Web Project (8)
        • Pet Shopping Mall GUI Project (10)
      • etc. (0)
  • 블로그 메뉴

    • Home
    • Write
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    Codeigniter
    오블완
    개발일지
    HTML
    Wordpress
    면접
    cs
    티스토리챌린지
    SpringBoot
    Swing
    Android
    CSS
    git
    Hotkeys
    http
    tailwindcss
    errorNote
    php
    SWAGGER
    SEO
    jsp
    zapier
    vuejs
    jQuery
    SQL
    typeScript
    java
    C#
    js
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
스응
[C#/dotnet] LINQ (Language-Integrated Query)
상단으로

티스토리툴바