LINQ란 Language Integrated Query 라고해서 특정 데이터들에서 Query를 하여 데이터를 빠르고 편리하게 추출하는 방식이라 할 수 있다. 해당기능은 C# 3.0부터 추가가 되기 시작한 문법이다. 기본적으로 람다표현식을 사용하여 간결하고 가독성 좋게 작성 가능하다. Query를 하는데에는 SQL을 사용한다. SQL 이란 Structured Query Language의 약자이다. 


SQL에서 가장 많이 사용하는 문법은 다음 4가지 이다.


from : 어떤 데이터에서 찾을 것인가


where : 어떤 조건으로 찾을 것인가


order by : 어떤 항목을 기준으로 정렬할 것인가


select : 어떤 항목을 추출할 것인가


LINQ는 이러한 SQL의 문법을 가지고 다양한 쿼리를 통해 데이터를 가공하고 집계하는 등에 사용된다. 전통적인 방싱그로 for문과 if문을 가지고 특정 데이터들을 가공하고 집계내는 것도 가능하다. 하지만 LINQ를 이용하면 빠르고 정확하게 데이터를 찾는 것이 가능하다. 그리고 더욱 중요한 가독성이 좋다. 문장을 서술 하듯 질의를 하기 때문에 for와 if문을 사용하는 방식보다 가독성이 좋아 실수를 줄이고 유지보수가 쉽다.

또한 병렬로 처리도 가능하기 때문에 일반적으로 코드를 작성해서 데이터를 추출하는 가공방식보다 속도가 빠를 수 있다.


LINQ는 기본적으로 아래에서 소개한 예제만 보면 어느정도 이해가 갈 것이다. 더욱 복잡한 예제들도 많이 존재 하고 사용방법도 복잡한 것들도 많지만 우선 아래 예제들을 보고 LINQ가 무엇인지 이해하자.


아래 예제는 1부터 9까지의 수중에 3의 배수를 찾는 예제이다. from 문으로 nums에 저장된 1부터 9까지의 숫자중 하나씩 추출하며 where 로 3의 배수인지를 검사한다. 검사결과가 참인 데이터인 num을 select 문으로 추출한다. 그 결과를 변수 numQuery에 저장한다. foreach문으로 결과를 출력한다. LINQ를 사용한 데이터 가공에 가장 기본적인 형태의 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Linq;
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = new int[9] { 12345678};
            var numQuery = from num in nums
                           where (num%3== 0
                           select num;
            foreach(int num in numQuery) //결과 출력            
                Console.Write(num +" ");            
        }
    }
}
cs

출력결과 : 3 6 9




아래 예제는 길이가 3글자인 문자열을 찾는 것이다. where에서 string.length ==3 으로 문자길이가 3인 것을 찾는다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Linq;
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            String[] names = new String[]{ "abc""kim","peter""Tistory""Z"};
            var nameQuery = from name in names
                                  where name.Length == 3
                                   select name;
            foreach(string name in nameQuery) // 결과 출력
                Console.WriteLine(name);
        }
    }
}
 
cs

출력 결과

abc 

kim




아래 예제는 60점이상 학생만 이름순으로 출력하는 것이다. student 클래스를 선언하여 이름과 점수를 저장하도록 한다. List객체를 만들어서 학생들의 정보를 저장한다. 그래서 해당 객체에 점수가 60점이상인 학생들을 where 문으로 검사하여 추출하고 orderby를 사용하여 이름순으로 정렬 시킨다. 그리고 select 에서 학생의 이름만을 추출한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.Linq;
namespace test
{
    public class Student
    {
        public string name { get; set; }
        public int score { get; set; }
    } 
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>
            {
                new Student { name = "zzz", score = 88},
                new Student { name = "kim", score = 50},
                new Student { name = "han", score = 76 },
                new Student { name = "park", score = 45 },
                new Student { name = "peter", score = 84 },
                new Student { name = "lee", score = 98 }
            };
            var smart = from student in students
                        where student.score >= 60 // 60점이상만
                        orderby student.name ascending//이름순으로 정렬
                        select student.name; //이름만 추출
 
            foreach(string studentName in smart)     //결과 출력        
                Console.WriteLine(studentName);
        }
    }
}
cs

출력 결과

han

lee

peter

zzz


orderby는 orderby 정렬기준 ascending 이런식으로 사용을 한다.

기본으로 오름차순(ascending)이며 내림차순으로 하고 싶다면 descending 을 써주면 된다. 디폴트는 오름차순인 ascending이기 때문에 반드시 명시할 필요는 없다.


이외에도 LINQ를 이용하면 합(Sum), 최대값(Max), 최소값(Min), 평균값(Average), 데이터 갯수(Count)들을 쉽게 계산할 수 있다. 아래 링크를 참고하도록 하자.

C# LINQ 집계함수(Sum,MAX,MIN,Average,count,Aggregate 등) : http://hijuworld.tistory.com/57

Posted by 꿈만은공돌
,