LINQ 문법 정리
기본적인 문법(from, where, orderby, select)
from 어떤 데이터에서 찾을 것인지
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public enum ClassType
{
Knight,
Archer,
Mage
}
public class Player
{
public ClassType classType { get; set; }
public int Level { get; set; }
public int Hp { get; set; }
public int Attack { get; set; }
public List<int> Items { get; set; } = new List<int>();
}
class Program
{
static List<Player> _players = new List<Player>();
static void Main(String[] args)
{
Random rand = new Random();
// player 데이터 100개 랜덤 생성
for (int i = 0; i < 100; i++)
{
ClassType type = ClassType.Knight;
switch (rand.Next(0, 3))
{
case 0:
type = ClassType.Knight;
break;
case 1:
type = ClassType.Archer;
break;
case 2:
type = ClassType.Mage;
break;
}
Player player = new Player()
{
classType = type,
Level = rand.Next(1, 10),
Hp = rand.Next(100, 1000),
Attack = rand.Next(5, 50)
};
for (int j = 0; j < 5; j++)
player.Items.Add(rand.Next(1, 101));
_players.Add(player);
}
//LINQ 사용
// 레벨이 50 이상인 Knight만 추려내서, 레벨 오름차순으로 정렬
var players =
from p in _players
where p.classType == ClassType.Knight && p.Level >= 50
orderby p.Level ascending
select p;
foreach (Player p in players)
{
Console.WriteLine($"{p.Level} {p.Hp}");
}
}
}
중첩 from
이중 foreach문과 유사하다.
1
2
3
4
5
6
7
8
// 아이템id가 30미만인 모든 아이템 목록을 추출
var playerItems =
from p in _players
from i in p.Items
where i < 30
select new { p, i };
var li = playerItems.ToList();
LINQ 중첩 from
grouping
데이터들을 그룹화하여 추출이 가능하다.
1
2
3
4
5
6
// 레벨별로 그룹화하여 추출
var playersByLevel =
from p in _players
group p by p.Level into g
orderby g.Key
select new { g.Key, Players = g };
LINQ grouping
join
두 데이터 리스트들을 join하여 추출이 가능하다.
1
2
3
4
5
6
7
8
// 레벨이 1, 5, 9인 player 데이터만 추출
List<int> levels = new List<int>() { 1, 5, 9 };
var playerLevels =
from p in _players
join l in levels
on p.Level equals l
select p;
LINQ join
LINQ 표준 연산자
LINQ는 SQL과 비슷한 문법으로 사용할 수 있게 되어 있지만 다른 문법으로도 사용이 가능하다.
1
2
3
4
5
6
7
8
9
10
var players =
from p in _players
where p.classType == ClassType.Knight && p.Level >= 50
orderby p.Level ascending
select p;
var players2 = _players
.Where(p => p.classType == ClassType.Knight && p.Level >= 50)
.OrderBy(p => p.Level)
.Select(p => p);
위 코드에서의 두 문법은 똑같이 동작한다.
우리가 SQL과 비슷한 문법으로 작성하더라도 실질적으로는 위와 같이 메소드 형태로 동작한다.
둘 다 알아놓는 것이 좋고 이외 많은 기능들이 있지만 필요할 때마다 찾아 사용하면 된다.