C# Linq

Posted by 알 수 없는 사용자
2015. 5. 18. 11:24 프로그래밍/C#

LINQ는 Language Integrated Query의 약자로 통합질의언어라고 말한다.

이름에서 보면 무언가 통합된 언어라는 의미인데, SQL의 Select구문과 유사한 구문을 이용하여 

컬렉션 형태의 데이터에 대해 질의를 통한 데이터처리가 가능하다. 

LINQ는 MS-SQL의 데이터나 메모리에 있는 컬렉션 객체, XML에서 사용된다.


다음과 같이 학생 객체가 있다.


1
2
3
4
5
6
7
8
List<StudentInfo> studentList = new List<StudentInfo>
 {
     new StudentInfo { Name = "Space", Age = 21, Grade = "A"}
     , new StudentInfo { Name = "ESC", Age = 22, Grade = "A+"}
     , new StudentInfo { Name = "Enter", Age = 23, Grade = "B+"}
     , new StudentInfo { Name = "Tab", Age = 30, Grade = "A-"}
     , new StudentInfo { Name = "Shift", Age = 25, Grade = "A+"}
 };


예를 들어 학생 리스트 중에서 A학점인 학생을 나이 순으로 정렬하고 싶다고 하자.

LINQ를 사용하지 않는 일반 코드를 이용하면 다음과 같이 표현할 수 있을 것이다.


1
2
3
4
5
6
7
8
9
List<StudentInfo> searchList = new List<StudentInfo>();
 
searchList = studentList.FindAll(sl => sl.Grade.Contains("A"));
searchList.Sort((sl1, sl2) => sl1.Age - sl2.Age );
             
foreach (StudentInfo student in searchList)
{
    Console.WriteLine("Name : " + student.Name + ", Age : " + student.Age + ", Grade : " + student.Grade);
}


List객체에서 사용가능한 함수와 람다식을 이용하여 최대한 간단하게 작성해 보았다.

그럼 LINQ를 이용한 코드를 한번 보자


1
2
3
4
5
6
7
8
9
var searchList = from sl in studentList
                 where sl.Grade.Contains("A")
                 orderby sl.Age
                 select sl;
 
 foreach (StudentInfo student in searchList)
 {
     Console.WriteLine("Name : " + student.Name + ", Age : " + student.Age + ", Grade : " + student.Grade);
 }


람다식을 이용한 코드도 굉장히 간단하다고 생각했는데

LINQ를 이용하면 좀 더 간단한 표현이 가능하다.


그럼 위에서 작성한 LINQ구문을 다시 잘 살펴보자

FROM, WHERE, ORDER등이 쓰이는 것을 보니 SQL과 유사하다는 것을 알 수 있다.

SQL과 비슷하여 이해되겠지만 하나씩 보도록 하자.


우선 from은 범위를 지정해 주는 부분이다.

foreach에서도 괄호 안에 범위를 지정하듯이 from뒤에 범위를 지정하면 된다.


1
from sl in studentList

그 다음 where은 조건을 정의하는 부분이다.
데이터에 대한 필터가 필요하다면 여기에 조건을 작성하면 된다.

1
2
3
     
var searchList = from sl in studentList
                 where sl.Grade.Contains("A")


order는 정렬을 정의하는 부분이다.

order + 정렬될 객체 뒤에 아무것도 없으면 오름차순으로 정렬되고, 반대로 내림차순으로 정렬하고 싶다면 desending을 추가한다.


1
2
3
var searchList = from sl in studentList
                 where sl.Grade.Contains("A")
                 orderby sl.Age

마지막으로 select에서는 추출할 데이터를 정의하면 된다.


1
2
3
4
var searchList = from sl in studentList
                 where sl.Grade.Contains("A")
                 orderby sl.Age
                 select sl;


전체 객체 추출도 가능하고 다음과 같이 필요한 데이터만 추출하는 것도 가능하다.


1
2
3
4
var searchList = from sl in studentList
                 where sl.Grade.Contains("A")
                 orderby sl.Age
                 select new { sl.Age, sl.Grade };



'프로그래밍 > C#' 카테고리의 다른 글

C# 람다식(Lamda Expression)  (9) 2015.04.11
C# 대리자(Delegate)  (288) 2015.04.08
C# 가비지 컬렉션(Garbage Collection)  (1274) 2015.03.23
C# 기본자료형, 변수  (10) 2015.03.22