c# LINQ를 사용한 데이터 쿼리 및 필터링

2024. 9. 27. 02:37c#

LINQ를 사용한 데이터 쿼리 및 필터링

LINQ(Language Integrated Query)는 C#에서 데이터를 간편하게 질의하고 필터링할 수 있는 강력한 도구입니다.
이를 통해 컬렉션, 데이터베이스, XML 등 다양한 데이터 소스에서 일관성 있는 쿼리 구문을 사용하여 데이터를 조작할 수 있습니다. 이 글에서는 LINQ를 활용해 데이터를 쿼리하고 필터링하는 방법을 살펴보겠습니다.


1. LINQ란 무엇인가?

LINQ는 C#에서 여러 데이터 소스를 쉽게 질의할 수 있도록 도와주는 쿼리 언어입니다.
LINQ는 컬렉션, 데이터베이스, XML 파일 등을 일관된 방식으로 처리할 수 있게 해줍니다. SQL과 유사한 구문을 사용하지만, C# 코드 내에서 자연스럽게 사용될 수 있도록 통합되어 있습니다.

LINQ의 특징:

  • 일관성 있는 구문: SQL과 유사한 구문을 사용하여 다양한 데이터 소스에서 동일한 방식으로 데이터를 다룰 수 있습니다.
  • 타입 안정성: 컴파일 시점에서 오류를 잡아낼 수 있어 안정성이 높습니다.
  • 확장성: LINQ는 기본 제공되는 연산자 외에도 사용자 정의 연산자를 추가할 수 있습니다.

2. LINQ로 데이터를 쿼리하는 방법

LINQ를 사용해 데이터를 쿼리하는 방법은 크게 두 가지로 나뉩니다: Query 구문Method 구문입니다.

Query 구문

SQL과 유사한 구문으로, 데이터 필터링 및 선택을 수행합니다.

int[] numbers = { 1, 2, 3, 4, 5 };

var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

foreach (var number in evenNumbers)
{
    Console.WriteLine(number);  // 출력: 2, 4
}

Method 구문

메서드 체이닝을 통해 데이터를 필터링하고 쿼리하는 방식입니다. 이는 주로 람다 표현식과 함께 사용됩니다.

int[] numbers = { 1, 2, 3, 4, 5 };

var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

foreach (var number in evenNumbers)
{
    Console.WriteLine(number);  // 출력: 2, 4
}

3. LINQ의 필터링 메서드

LINQ에서 데이터를 필터링하는 데 유용한 다양한 메서드를 제공합니다.
이 섹션에서는 몇 가지 기본적인 필터링 메서드를 소개합니다.

1) Where: 조건에 맞는 요소 필터링

Where 메서드는 컬렉션에서 특정 조건을 만족하는 요소를 필터링하는 데 사용됩니다.

List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };

var shortNames = names.Where(name => name.Length <= 4);

foreach (var name in shortNames)
{
    Console.WriteLine(name);  // 출력: Bob
}

2) Select: 데이터 변환

Select 메서드는 데이터를 변환하거나 가공하는 데 사용됩니다. 쿼리 결과를 다른 형태로 변환하고 싶을 때 유용합니다.

int[] numbers = { 1, 2, 3, 4, 5 };

var squaredNumbers = numbers.Select(n => n * n).ToList();

foreach (var number in squaredNumbers)
{
    Console.WriteLine(number);  // 출력: 1, 4, 9, 16, 25
}

3) OrderBy / OrderByDescending: 정렬

OrderBy는 데이터를 오름차순으로 정렬하고, OrderByDescending은 내림차순으로 정렬합니다.

int[] numbers = { 5, 2, 8, 1, 4 };

var sortedNumbers = numbers.OrderBy(n => n).ToList();

foreach (var number in sortedNumbers)
{
    Console.WriteLine(number);  // 출력: 1, 2, 4, 5, 8
}

4) First / FirstOrDefault: 첫 번째 요소 선택

First 메서드는 컬렉션에서 조건에 맞는 첫 번째 요소를 반환합니다. 만약 조건에 맞는 요소가 없으면 FirstOrDefault는 기본값을 반환합니다.

List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };

var firstOddNumber = numbers.First(n => n > 3);
Console.WriteLine(firstOddNumber);  // 출력: 5

5) GroupBy: 데이터 그룹화

GroupBy 메서드는 데이터를 특정 조건에 따라 그룹으로 나누는 데 사용됩니다.

 
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };

var groupedNames = names.GroupBy(name => name.Length);

foreach (var group in groupedNames)
{
    Console.WriteLine($"이름 길이: {group.Key}");
    foreach (var name in group)
    {
        Console.WriteLine(name);  // 그룹화된 이름 출력
    }
}

4. LINQ를 활용한 복합적인 필터링

LINQ는 여러 가지 필터링 조건을 결합하여 더욱 복잡한 쿼리를 작성할 수 있습니다.

List<int> numbers = new List<int> { 1, 3, 5, 7, 9, 10, 12, 14, 16 };

var filteredNumbers = numbers
    .Where(n => n > 5 && n % 2 == 0)  // 5보다 크고 짝수인 숫자 필터링
    .OrderByDescending(n => n)  // 내림차순 정렬
    .ToList();

foreach (var number in filteredNumbers)
{
    Console.WriteLine(number);  // 출력: 16, 14, 12, 10
}

위의 예시에서는 Where 메서드로 숫자를 필터링하고, OrderByDescending을 사용해 내림차순으로 정렬했습니다.


5. 다양한 데이터 소스에 대한 LINQ

LINQ는 단순한 배열이나 리스트뿐만 아니라, 데이터베이스, XML, JSON 등 다양한 데이터 소스에도 적용할 수 있습니다.

LINQ to SQL

LINQ는 SQL과 유사한 방식으로 데이터베이스를 질의할 수 있게 해줍니다.
LINQ to SQL 또는 Entity Framework를 사용하여 데이터베이스에 쿼리를 작성할 수 있습니다.

 
using (var context = new SchoolContext())
{
    var students = from s in context.Students
                   where s.Age > 20
                   select s;

    foreach (var student in students)
    {
        Console.WriteLine(student.Name);
    }
}

XML 데이터를 처리할 때도 LINQ를 사용할 수 있습니다.

XDocument xmlDoc = XDocument.Load("students.xml");

var students = from student in xmlDoc.Descendants("Student")
               where (int)student.Element("Age") > 20
               select student;

foreach (var student in students)
{
    Console.WriteLine(student.Element("Name").Value);
}

 


6. LINQ의 장점

LINQ는 코드의 가독성을 높이고, 복잡한 데이터를 효율적으로 다룰 수 있는 다양한 기능을 제공합니다. LINQ를 사용하면 데이터 필터링, 정렬, 변환 등의 작업을 간결한 코드로 처리할 수 있습니다.

LINQ의 주요 장점:

  1. 일관된 구문: 다양한 데이터 소스에 대해 동일한 구문을 사용할 수 있습니다.
  2. 타입 안전성: 컴파일 시점에 오류를 방지할 수 있는 타입 안전성을 제공합니다.
  3. 코드 가독성: LINQ를 사용한 코드는 데이터 처리 로직을 더욱 직관적으로 표현할 수 있습니다.
  4. 확장성: LINQ는 기본 제공되는 쿼리 연산자 외에도 확장이 가능합니다.

 

LINQ는 C#에서 데이터를 간편하고 효율적으로 필터링하고 쿼리할 수 있는 도구입니다.
LINQ의 다양한 메서드를 활용하면 데이터를 변환, 정렬, 그룹화하고 복잡한 조건에 맞게 필터링할 수 있습니다.
LINQ를 통해 데이터 처리 작업을 보다 간결하고 직관적으로 구현할 수 있습니다.