프로그래밍 언어 및 IT 정보/C#

c# LINQ란?- 개념잡기

Himer_torr 2023. 6. 19. 00:07
반응형

오늘은 c#에서 LINQ를 공부해보려한다.

c#에서 데이터를 쿼리하고 조작할 때 개발자들은 종종 루프나 조건문 등

복잡한 논리를 작성해야하지만 c#에서는 이러한 작업들을 간소화하는

LINQ(Language-Intergrated Query) 라는 기능을 제공한다.

 

1. LINQ란?

 LINQ(Language-Intergrated Query)는 다양한 데이터 소스를 쿼리하고 조작하기 위한 일관되고

직관적인 방법을 제공하는 c#의 언어 확장 집합이다. LINQ를 사용하면 친숙한 SQL 유사 구문 또는 

메서드 기반 접근 방식을 사용하여 개체, 컬렉션, 데이터베이스, XML 등을 쿼리할 수 있다.

 

2. LINQ의 이점은?

  • 가독성과 표현력 : LINQ는 복잡한 데이터 작업을 간결하고 선언적인 방식으로 표현할 수 있도록 하여
    코드를 단순화하고 가독성을 향상시킨다.
  • 타입 안정성 및 컴파일 검사 : LINQ의 중요한 장점 중 하나는 C# 유형 시스템과의 통합이다.
    즉 컴파일 타임 검사를 통해 쿼리가 유효하고 형식이 안전한지 확인할 수 있다. 이는 개발 프로세스 초기에 오류를
    포착하여 런탕미 예외를 줄이는 데 도움이 된다.
  • 코드 재사용성 : LINQ를 사용하면 쿼리를 한 번 작성하고 여러 데이터 소스에서 재사용이 가능하다.
    이는 코드 재사용성을 촉진하고 중복성을 줄이며 유지 관리성을 향상시킨다. 또한 LINQ 쿼리는 메서드 또는 
    속성으로 쉽게 캡슐화되어 모듈식 및 조직화된 코드를 사용할 수 있다.
  • C#과의 원활한 통합: 언어 확장으로서 LINQ는 나머지 C# 언어와 원활하게 통합된다. LINQ를 람다 식, 익명 형식 및 예외 처리와 같은 다른 언어 기능과 결합할 수 있다. 이 시너지를 통해 표현력 있고 효율적인 코드를 작성하여 복잡한 데이터 작업을 쉽게 처리할 수 있다.

 

3. LINQ 사용법

LINQ는 쿼리 구문매서드 구문이라는 2가지 구문 스타일을 제공한다. 쿼리 구문은 SQL과 유사하며 데이터 쿼리에 대한 

선언적 접근방식을 제공하는 반면 메서드 구문은 메서드 체인을 사용하여 동일한 결과를 얻을 수 있다.

  • from - 어떤 데이터에서 원하는 값을 추출할 것인지
  • where - 원하는 값을 추출하기 위한 조건
  • select - 데이터에서 어떤 항목을 추출할 것인지
// Query 구문
var querySyntaxResult = from number in numbers
                        where number % 2 == 0
                        orderby number descending
                        select number;

// Method 구문
var methodSyntaxResult = numbers
                        .Where(number => number % 2 == 0)
                        .OrderByDescending(number => number)
                        .Select(number => number);

예제 2 : 데이터 필터링 및 정렬

데이터를 필터링하면 특정 조건과 일치하는 특정 요소를 추출할 수 있으며 정렬은 데이터를 특정 순서로 정렬도 가능하다.

LINQ에서는 Where() 메서드를 사용하여 필터링을 수행하고 OrderBy() 및 OrderByDescending()을 사용하여 정렬을 수행할 수 있다.

var numbers = new List<int> { 10, 7, 4, 15, 21, 30, 18 };

// Filtering data using Where()
var evenNumbers = numbers.Where(number => number % 2 == 0);

// Sorting data using OrderBy() and OrderByDescending()
var sortedNumbers = numbers.OrderBy(number => number);
var descendingNumbers = numbers.OrderByDescending(number => number);

예제 3:데이터 결합 및 그룹화

LINQ는 서로 다른 소스의 데이터를 결합하고 그룹화하는 메커니즘을 제공한다.

Join() 및 GroupJoin() 매서드를 사용하면 공통 키를 기반으로 데이터를 조인할 수 있으며, GroupBy() 메서드를 사용하면 

특정 기준에 따라 그룹화 할 수도 있다.

// Joining data using Join() and GroupJoin()
var joinedData = from employee in employees
                 join department in departments on employee.DepartmentId equals department.Id
                 select new { employee.Name, department.Name };

var groupedData = from employee in employees
                  join department in departments on employee.DepartmentId equals department.Id into groupedDepartments
                  select new { employee.Name, Departments = groupedDepartments };

// Grouping data using GroupBy()
var groupedEmployees = employees.GroupBy(employee => employee.DepartmentId);

예제3 : 집계 및 집합 연산

LINQ는 데이터 집계 및 집합 작업 수행을 위한 메서드 또한 제공한다. Count(), Sum(), Average(), Min() 및 Max()

매서드를 사용하면 특정 기준에 따라 집계 값을 계산할 수 있다.  또한 Union(), Intersect(), Except() 및 Distinct() 메서드를 사용하면 컬렉션에서 설정 작업을 수행할 수 있다.

 

// Aggregate calculations using Count(), Sum(), Average(), Min(), Max()
var count = numbers.Count();
var sum = numbers.Sum();
var average = numbers.Average();
var min = numbers.Min();
var max = numbers.Max();

// Perform set operations using Union(), Intersect(), Except(), and Distinct()
var unionResult = numbers1.Union(numbers2);
var intersectResult = numbers1.Intersect(numbers2);
var exceptResult = numbers1.Except(numbers2);
var distinctResult = numbers.Distinct();
  • Union() : 두 컬렉션을 결합하고 두 소스의 고유한 요소를 포함하는 새 컬렉션을 반환 - 중복 제거
  • Intersect() : 두 컬렉션 간 공통 요소를 포함하는 새 컬렉션 반환
  • Except() : 두 컬렉션에 존재하지 않는 첫번째 컬렉션의 요소를 포함하는 새 컬렉션 반환 -공통요소 제외
  • Distinct() : 단일 컬렉션의 고유한 요소들만 반환 - 중복 제거 

 

LINQ를 마스터하게 되면 컬렉션, 배열 , 데이터베이스 및 xml을 비롯한 다양한 소스의 데이터를 효율적으로 조작할 수 있다. LINQ를 사용하면 개발 프로세스를 간소화하고 코드 가독성을 높이며 생상선을 높일 수 있다.

 

 

반응형