▶ 링크란?
- LINQ ( Language Intergreated Query )는 언어에 통합된 쿼리문을 의미하는
것으로 링크를 사용하면 컬렉션을 대상으로 데이터 베이스에 요청하는것처럼
쿼리문을 실행하는 것이 가능하다.
ㄴ 즉, 링크를 활용하면 데이터의 필터링 작업을 좀더 수월하게 하는것이 가능하다.
▷ C언어 링크의 특징
- 링크는 언어에 내장된 쿼리문이기 때문에 간단한 쿼리문 작성을 통해서 쉽게 데이터
필터링 하는것이 가능하다.
ㄴ 데이터의 탐색에 대한 효율성이 극대화 된다.
- 링크는 항상 from 키워드를 통해서 시작되면 select 키워드를 통해서 최종적인
데이터를 필터링 하는것이 가능하다.
- 링크는 group 키워드를 통해서 특정 데이터를 2가지로 그룹화 시키는것이 가능하다.
▷ 데이터 타입 정리
from
- 모든 쿼리식은 from으로 시작해야 한다.
EX: from 범위 변수 in 데이터 변수
where
- 데이터의 원본으로부터 차례대로 요소를 가져오고 그 요소가 범위 변수에
들어가게 되면 조건식을 통해 걸러내는 역활을 한다,
만약 요소에 대해 조건식 거짓이면 요소를 반환하지 않고 참이면 요소를 반환
- 필터와 같은 역활이라고 생각하면 편하다. EX: where 조건식
orderby
- 데이터의 정렬을 수행하고 오름차순 혹은 내림차순으로 정렬된 결과를
출력하겠다.
- 기본적으로 링크는 오름차순 정렬을 하며 "," 를 통해 둘이상의 데이터를
한꺼번에 정렬시킬 수 있다.
- 오름차순일 경우 ascending 키워드를 뒤에 붙이며
내림차순일 경우 decending 키워드를 뒤에 붙인다.
select
- 앞에 있는 모든 절과 select 절을 거쳐서 나오는 최종 결과를 뽑아낸다.
- 기억해야 될건 LINQ 쿼리식은 from으로 시작했으면 , select 절 또는
group 절로 끝나야만 한다.
group
- 분류 기준에 따라 데이터를 분류하고 그룹화하여 그룹 개체를 반환한다.
- 우리가 모양에 따라 , 색깔에 따라, 맛 등의 기준에 따라 나누듯 LINQ 쿼리식에서도
group절을 이용하여 데이터를 분류할 수 있다.
join
- 직접 관계가 없는 두개의 데이터 원본을 연결할때 사용한다.
EX)
struct STCharacter
{
public int ID;
public int HP;
public int Level;
public STCharacter(int ID, int HP, int Level)
{
this.ID = ID;
this.HP = HP;
this.Level = Level;
}
}
struct 로 캐릭터를 만들어준다.
public void Awake()
{
var oCharacterList = new List<STCharacter>();
oCharacterList.Add(new STCharacter(1, 100, 10));
oCharacterList.Add(new STCharacter(2, 200, 20));
oCharacterList.Add(new STCharacter(3, 300, 30));
oCharacterList.Add(new STCharacter(4, 400, 40));
oCharacterList.Add(new STCharacter(5, 500, 50));
var oResult = (from STCharacter in oCharacterList
where STCharacter.HP >= 300 || STCharacter.Level > 20
orderby STCharacter.Level ascending
select STCharacter).ToList();
for (int i = 0; i < oResult.Count; ++i)
{
var stCharacter = oResult[i];
Debug.LogFormat("캐릭터 정보 : {0},{1},{2}",
stCharacter.ID, stCharacter.HP, stCharacter.Level);
}
}

추가적으로 쿼리 작업을 수행하려면 into 키워드를 사용해야 한다.
그렇지 않을 경우에는 into 와 그룹 변수를 쓰지 않아도 된다.
var oGroupResult = (from stCharacter in oCharacterList
where stCharacter.HP >= 300 || stCharacter.Level > 20
orderby stCharacter.Level ascending
group stCharacter by stCharacter.HP >= 300 into oGroup
select new
{
GroupKey = oGroup.Key,
Characters = oGroup
}).ToList();
for (int i = 0; i < oGroupResult.Count; ++i)
{
var oGroup = oGroupResult[i];
var oCharacters = oGroup.Characters.ToList();
for (int j = 0; j < oCharacters.Count; ++j)
{
var stCharacter = oCharacters[j];
Debug.LogFormat("Key: {0}, Character: {1} ,{2} ,{3}", oGroup.GroupKey,
stCharacter.ID, stCharacter.HP, stCharacter.Level);
}
}
