c# LINQ (Language Integrated Query) 기초

2024. 9. 27. 02:33c#

LINQ (Language Integrated Query) 기초

LINQ는 C#에서 데이터 소스에 대해 일관성 있고 간결한 쿼리를 작성할 수 있게 해주는 강력한 기능입니다.
LINQ는 데이터베이스, XML, 컬렉션, 배열 등 다양한 데이터 소스에 대해 동일한 구문을 사용할 수 있어 매우 유용합니다. 이 글에서는 LINQ의 기본 개념과 함께 C#에서 어떻게 활용할 수 있는지 기초적인 사용법을 설명하겠습니다.


1. LINQ란 무엇인가?

LINQ(Language Integrated Query)는 C#에서 데이터를 질의하는 통합된 방법을 제공하는 기능입니다.
LINQ는 SQL과 비슷한 구문을 사용해 데이터를 조회, 필터링, 변환 등의 작업을 수행할 수 있으며, 이를 통해 다양한 데이터 소스에 대해 통합된 쿼리 방법을 제공합니다.

주요 데이터 소스:

  • 컬렉션 (List, Array, Dictionary 등)
  • 데이터베이스 (SQL Server, MySQL 등)
  • XML 파일
  • Entity Framework와 같은 ORM

2. LINQ 기본 구문

LINQ는 두 가지 스타일로 사용할 수 있습니다.

1) 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
}

2) Method 구문

메서드 체이닝을 사용하는 방식으로도 LINQ 쿼리를 작성할 수 있습니다. 이는 람다 표현식과 함께 사용되는 경우가 많습니다.

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: 정렬

데이터를 오름차순 또는 내림차순으로 정렬할 때 사용됩니다.

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) 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);  // 그룹화된 이름들 출력
    }
}

5) First / FirstOrDefault: 첫 번째 요소 가져오기

조건에 맞는 첫 번째 요소를 가져오는 데 사용됩니다.

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

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

 


4. LINQ와 컬렉션

LINQ는 다양한 컬렉션 타입에 적용할 수 있습니다. 예를 들어, 배열, 리스트, 딕셔너리 등과 함께 사용할 수 있습니다.

1) 배열과 LINQ

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

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

2) 리스트와 LINQ

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

var namesWithA = names.Where(name => name.Contains("a")).ToList();

3) 딕셔너리와 LINQ

Dictionary<int, string> students = new Dictionary<int, string>
{
    { 1, "John" },
    { 2, "Jane" },
    { 3, "Jim" }
};

var filteredStudents = students.Where(s => s.Key > 1).ToDictionary(s => s.Key, s => s.Value);

foreach (var student in filteredStudents)
{
    Console.WriteLine($"{student.Key}: {student.Value}");  // 출력: 2: Jane, 3: Jim
}

 


5. LINQ의 장점

LINQ는 다음과 같은 여러 장점을 제공합니다.

  1. 통합된 구문: LINQ는 다양한 데이터 소스에 대해 동일한 구문을 사용할 수 있습니다.
  2. 가독성: LINQ 쿼리는 데이터 처리 로직을 간결하게 표현하므로 코드 가독성이 높아집니다.
  3. 타입 안정성: LINQ는 강력한 타입 안정성을 제공하므로 컴파일 타임에 오류를 잡을 수 있습니다.
  4. 확장성: LINQ는 다양한 데이터 소스 및 컬렉션을 지원하며, 사용자 정의 쿼리 연산자를 추가할 수도 있습니다.

6. LINQ를 사용한 데이터베이스 쿼리

LINQ는 단순히 컬렉션뿐만 아니라 LINQ to SQL, Entity Framework 등을 통해 데이터베이스 쿼리에도 사용할 수 있습니다. 예를 들어, SQL Server와 같은 관계형 데이터베이스에서 LINQ를 사용하여 데이터베이스 질의를 작성할 수 있습니다.

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

 


 

LINQ는 C#에서 데이터를 처리하는 데 매우 유용한 도구입니다.
일관된 구문과 강력한 타입 안정성을 제공하며, 컬렉션이나 데이터베이스와 같은 다양한 데이터 소스에 대해 쉽게 쿼리를 작성할 수 있습니다. LINQ의 기초 개념을 잘 이해하면, 복잡한 데이터 처리도 간결하고 효율적으로 구현할 수 있습니다.