콘텐츠로 건너뛰기
Home » LINQ(링크) from,where,orderby,select

LINQ(링크) from,where,orderby,select

  • by
LINQ(링크) from,where,orderby,select

LINQ 란?

LINQ(링크)는 Language Integrated Query의 약어로, 직역하면 “질의로 통합된 언어” 이다.

말이 참 어렵다. 그냥 쉽게 말해 ” 데이터에 대해 질문하는 언어” 라고 볼수 있다.

C# 에서는 데이터에 대핸 질문하는 LINQ 라는 기능을 제공한다.

LINQ의 역할은 데이터에 대해 질문하고, 그 답에 해당하는 데이터를 찾는것이다.

이러한 LINQ의 질의 기능은 프로그램에서 데이터 검색을 편리하게 해준다.

예를 들어 결혼정보업체에서 한국의 모든 사람에 대한 데이터를 가지고 있는데, 그 중에 여자이면서 20세 이상 성인들의 데이터를 어린 나이 순으로 찾는다고 치자, 그럼 데이터를 하나 하나 검색하면서 이런 질문을 던질수 있을것이다.

첫번째 여자인가?
두번째 검색된 여자 가운데 20세 이상인가?
세번째 검색된 20세 이상인 여자중에 나이 순으로 정렬 하고자 할때..

이렇게 세 질문을 거치면 선인 여자를 어린 나이 순으로 찾을수 있다.
위의 질문들을 LINQ 쿼리식으로 작성하면 다음과 같다.

var woman = from women in womanList // womanList에서 (여자인가?)
where woman.age > 20 // 20세 이상인가?
orderby woman.age // 나이 순으로 정렬
select woman; // 배열 데이터로 추출된다.
만약 이를 LINQ없이 단순 코드로만 작성하면 다음과 같다.List<Woman> Women = new List<Woman>;
// 여자 리스트에서 20세 이상 성인 추출
foreach(Woman woman in womanList) {
    if (woman.age > 20) {
        Women.add(woman);
    }
}
// 어린 나이순으로 정렬
Women.Sort((w1, w2) => w1.age - w2.age;);
// 추출된 성인여자 데이터를 출력
foreach(var woman in Women) {
    Console.WriteLine("{0},{1}", woman.name, woman.age);
}

상당히 많은 코드를 생략하며 작성했지만 이정도 입니다.
LINQ를 쓰면 얼마나 코드가 단순화 되는 실감할수 있을것입니다.

from

데이터를 검색하기 위해서는 우선적으로 데이터를 검색할 범위를 지정해 주어야 합니다.
그 역할을 해주는것이 from 절 입니다.
이제 from 에서 범위를 지정해주면 그 범위 내에서 데이터 검색이 시작되기 때문에 모든 LINQ 쿼리식 (Query Expression) 은 반드시 from 으로 시작해야 합니다.

from절의 작성 형식은 foreach문과 비슷합니다.

foreach(var element in array) == form element in array

foreach 문과 from 절의 element 변수의 차이점

foreach의 element 변수에는 실제로 array의 데이터가 저장됩니다.
하지만 LINQ에서는 element 변수에 테이터가 저장되지 않고, 단순히 array 에 존재하는 요소 라는 의미로만 사용됩니다.

Woman[] womanList = {
    new Woman() {
        name = "A씨",
        age = 34
    },
    new Woman() {
        name = "B씨",
        age = 37
    },
    new Woman() {
        name = "C씨",
        age = 20
    },
    new Woman() {
        name = "D씨",
        age = 24
    },
    new Woman() {
        name = "E씨",
        age = 47
    }
};
var women = from woman in womanList
where woman.age > 20
orderby woman.age
select woman;

from(var women = from woman in womanList)에서 사용가능한 타입은 IEnumerable<T> 인터페이스를 상속하는 타입입니다.
C#에서의 배열이나 컬렉션들은 모두 IEnumerable<T>을 상속하기 때문에 배열이나 컬렉션 타입이라면 전부 사용가능합니다.

where

from 으로 검색 범위를 지정하였다면, where은 범위 내에서 데이터를 걸러내는 필터 역할을 합니다.
where에서는 데이터를 걸러내기 위한 필터 조건을 작성해주면 됩니다.

Woman[] womanList = {
    new Woman() {
        name = "A씨",
        age = 34
    },
    new Woman() {
        name = "B씨",
        age = 37
    },
    new Woman() {
        name = "C씨",
        age = 20
    },
    new Woman() {
        name = "D씨",
        age = 24
    },
    new Woman() {
        name = "E씨",
        age = 47
    }
};
var women = from woman in womanList
where woman.age > 20
orderby woman.age
select woman;

(where woman.age > 20)

해당 조건에 참이 되는 데이터만 걸러지게 됩니다.

orderby

orderby는 걸러진 데이터를 정렬해주는 연산자 입니다.
기본값으로 오름차순 정렬을 사용하기 때문에 정렬 키워드 없이 정렬 기준만 제시하면, 그 기준에 따라 오름차순(ascending)으로 정렬해줍니다.

Woman[] womanList = {
    new Woman() {
        name = "A씨",
        age = 34
    },
    new Woman() {
        name = "B씨",
        age = 37
    },
    new Woman() {
        name = "C씨",
        age = 20
    },
    new Woman() {
        name = "D씨",
        age = 24
    },
    new Woman() {
        name = "E씨",
        age = 47
    }
};
var women = from woman in womanList
where woman.age > 20
orderby woman.age
// 오름차순 정렬
// orderby woman.age ascending 오름차순 정렬
// orderby woman.age descending 내림차순 정렬
select woman;

orderby woman.age
// 오름차순 정렬
// orderby woman.age ascending 오름차순 정렬
// orderby woman.age descending 내림차순 정렬

가독성을 위해 오름차순(ascending) 과 내림차순(descending)을 명시해주는것이 좋다고 생각합니다.

#가독성의 의미 – 문자, 기호 또는 도형이 얼마나 쉽게 읽히는가 하는 능률의 정도

select

최종적으로 검색된 데이터를 추출하는 역할을 합니다.
추출된 데이터의 타입은 select절에 지정한 변수의 타입으로 결정되며, 무명형식(타입)으로 만들어서 추출할수도 있습니다.

select woman; // woman형 배열 데이터 전부 추출
select woman.name; // string형 name 배열 데이터만 추출
select new {
    title = "성인여자", name = woman.name
}; // 무명 타입의 배열 데이터를 추가해서 추출하는 방법도 가능

지금까지의 내용응 간단히 프로그램으로 작성해 보자.

(주의 : 링크를 사용하기 위해서는 System.Linq 네임스페이스를 추가해주어야 한다.)

using System.Linq;
class Woman {
    public string name {
        get;
        set;
    }
    public int age {
        get;
        set;
    }
}
class MainApp {
    static void Main(string[] args) {
        Woman[] womanList = {
            new Woman() {
                name = "A씨",
                age = 34
            },
            new Woman() {
                name = "B씨",
                age = 37
            },
            new Woman() {
                name = "C씨",
                age = 20
            },
            new Woman() {
                name = "D씨",
                age = 24
            },
            new Woman() {
                name = "E씨",
                age = 47
            }
        };
        var Women = from woman in womanList
        where woman.age > 20
        orderby woman.age ascending //오름차순 정렬
        select new {
            title = "성인 여자",
            name = woman.name
    };
    foreach(var woman in Women) {
        Console.WriteLine("{0}: {1}", woman.title, woman.name);
    }
}}

댓글 남기기