C#/LINQ

[C#]LINQ 질의 구문과 메서드 구문

DevStory 2022. 7. 10.

LINQ를 사용하여 원하는 데이터를 추출하기 위해 질의(Query)를 작성하는 방법은 질의 구문(Query Syntax)과 메서드 구문(Method Syntax)이 존재합니다.

 

질의 구문과 메서드 구문은 동일한 작업을 수행하지만 소스 코드를 작성하는 방법은 다릅니다. 쿼리 구문은 DataBase의 Query문과 비슷하고 메서드 구문은 C#의 문법과 매우 유사합니다.

 

즉, DataBase에서 Query문을 작성해보지 않은 개발자는 쿼리 구문보다 메서드 구문이 익숙할 것이며, Query문을 작성해본 개발자는 쿼리 구문이 익숙할 수 있습니다.


질의 구문(Query Syntax)

질의 구문은 LINQ를 소개하는 포스팅에서 설명했듯이 from 키워드로 시작해서 select 키워드로 끝납니다. 질의 구문에서 사용되는 from, where, select, order 키워드는 메서드가 아니라는 점을 기억해주세요.

 

[C#]링크(LINQ)란?

LINQ란? LINQ(Language-INtegrated Query)의 약자인 LINQ는 데이터 질의(Query) 기능을 C#에서 사용할 수 있는 기술입니다. 쉽게 설명하자면 C#의 배열, 컬렉션, XML, DataSet 등... 에서 내가 원하는 데이터만 가..

developer-talk.tistory.com

from 절에는 추출하고 싶은 데이터가 존재하는 데이터 소스(=시퀀스)를 설정합니다. 데이터 소스는 IEnumerable<T> 인터페이스를 구현해야 하는데, 대부분의 컬렉션 클래스는 IEnumerable<T> 인터페이스를 구현합니다.

 

다음 예제는 질의 구문을 사용하였으며, Person이라는 타입을 가지는 List에서 age가 30보다 큰 항목들을 추출합니다.

class Person
{
  public string name;
  public int age;
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> person = new List<Person>
    {
      new Person() { name = "Bob",  age = 20},
      new Person() { name = "Nick", age = 34},
      new Person() { name = "John", age = 30},
      new Person() { name = "Tim",  age = 42},
    };

    var linqResult = from    obj in person
                     where   obj.age >= 30
                     orderby obj.age ascending
                     select  obj;

    foreach (var obj in linqResult)
      Console.WriteLine("name: " + obj.name + " / age: " + obj.age);
  }
}

[실행 결과]

name: John / age: 30
name: Nick / age: 34
name: Tim / age: 42

메서드 구문(Method Syntax)

List는 컬렉션의 클래스이며, IEnumerable<T> 인터페이스를 구현합니다.

따라서, 질의 구문에서 보여준 예제를 메서드 구문으로 변환할 수 있습니다.

class Person
{
  public string name;
  public int age;
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> person = new List<Person>
    {
      new Person() { name = "Bob",  age = 20},
      new Person() { name = "Nick", age = 34},
      new Person() { name = "John", age = 30},
      new Person() { name = "Tim",  age = 42},
    };

    var linqResult = person.Where(item => item.age >= 30).OrderBy(item => item.age);

    foreach (var obj in linqResult)
      Console.WriteLine("name: " + obj.name + " / age: " + obj.age);
  }
}

[실행 결과]

name: John / age: 30
name: Nick / age: 34
name: Tim / age: 42

질의 구문에 비해 코드가 훨씬 간결해졌으며, LINQ의 질의 구문을 메서드로 변경하였습니다.

  • from 키워드 대신 List 객체인 person을 직접 호출합니다.
  • where 키워드 대신 Where 메서드로 대체하였으며, 질의 구문의 조건문을 람다식으로 작성합니다.
  • orderby 키워드 대신 OrderBy 메서드로 대체하였으며, 정렬 기준을 람다식으로 작성합니다.
  • 메서드 구문에서 데이터 소스의 모든 항목을 추출하는 경우 select 키워드를 생략할 수 있습니다.

C#에서 람다식을 사용하는 방법은 아래 포스팅을 확인할 수 있습니다.

 

[C#]람다식, 람다표현식(Lambda expression)

람다식(Lambda expression)이란? 람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)입니다. 람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 코드를 더 가독성 있게 만

developer-talk.tistory.com


정리

  • LINQ의 질의(Query)를 작성하는 방법으로 질의 구문과 메서드 구문이 존재합니다.
  • 질의 구문은 DataBase에서 Query문을 작성해본 개발자에게 익숙할 수 있습니다.
  • C#의 메서드, 인터페이스, 람다식에 대해 이해도가 높다면 메서드 구문이 익숙할 수 있습니다.
반응형

'C# > LINQ' 카테고리의 다른 글

[C#]LINQ Select절  (0) 2022.07.10
[C#]LINQ 확장 메서드  (0) 2022.07.10
[C#]LINQ와 IEnumerable, IQueryable 인터페이스  (0) 2022.07.10
[C#]LINQ 중복 제거  (0) 2022.07.10
[C#]링크(LINQ)란?  (1) 2022.07.09

댓글