반응형
SMALL
- 정의
- 데이터 질의 ( Query ) 기능을 C#에서 사용할 수 있는 기술이다.
- 네이티브 데이터 질의 기능을 닷넷 언어에 추가하는 닷넷 프레임워크 구성 요소이다.
- 2007년 닷넷 프레임워크 3.5 버전에 처음 출시 되었다 .
- C# 의 Array, Collection, XML, DataSet, RDBMS 등 에서 내가 원하는 데이터를 추출 및 가공할 수 있다.
//Linq 기본 사용법
//배열의 값이 2보다 크고 8보다 작은 값을 추출하는 예제
class Program
{
static void Main(String[] args)
{
int[] intArr = {1,2,3,4,5,6,7,8,9,10}
var linqResult = from num in intArr
where num > 2 && num < 8
select num
foreach(var num in linqResult)
{
Console.WriteLine($"현재 값은 : {num}");
}
}
}
// LINQ 의 Result 값은 IEnumerable 이기 때문에
// foreach를 사용할 수 있다.
//출력 값
현재 값은 : 3
현재 값은 : 4
현재 값은 : 5
현재 값은 : 6
현재 값은 : 7
- LINQ 의 주요 및 장단점
- LINQ 의 주요 기능
- LINQ to Objects : 배열, 컬렉션, 제네릭 컬렉션에서 LINQ를 사용해 원하는 데이터를 추출 할 수 있다.
- LINQ to RDBS ( Sql server ) : RDB의 데이터를 추출 할 수 있다.
- LINQ to NoSql : IQueryable 개체를 통해 NoSql DB 의 데이터를 추출 할 수 있다.
- LINQ to DataSet : DataSet<Model>을 사용해 DB 에 접근해 원하는 데이터를 추출 할 수 있다.
- LINQ 의 장점
- SQL 문과 유사하다. SQL문에 익숙한 사람은 사용하기에 용이하
- C# 유형 시스템과 통합이다. 즉 컴파일 시점에 검사를 통해 쿼리가 유효하고 형식이 안전한지 판단 할 수 있다.
- 가독성과 표현력이 좋아진다. 복잡한 데이터를 간결하고 선언적인 방식으로 표현 할 수 있다.
- 코드의 재사용성 : LINQ를 사용해 쿼리를 작성하면 여러 데이터 소스에서 재사용이 가능하며, 이는 코드 간결화와 생산성을 높이는 이점을 가져온다.
- LINQ 의 단점
- 쿼리문을 잘못 작성하면 for,foreach 와 같은 반복문을 사용하는 것 보다 낮은 성능을 보인다.
- SQL 과 유사하지만, 복잡한 쿼리문을 작성할 수 없다.
- LINQ 의 주요 기능
- LINQ 의 기본 구조
- from - 어떤 데이터에서 원하는 값을 추출할 것 인지
- where - 어떤 조건에서 데이터를 추출할 것 인지
- select - 최종 연산된 데이터만 추출
string[] strArr = {"hello","world","C#","python","sql"}
var linqResult = from str in strArr
where str.startWith("h") && str.length() > 2
select str;
//form
// strArr 배열로 부터 데이터를 하나씩 넣는다
from str in strArr
//where
// 데이터의 시작이 h에서 시작하며 길이가 2 초과인 데이터를 얻는다
where str.startWith("h") && str.length() > 2
//select
//추려진 데이터를 linqResult에 담는다
select str;
- 질의 구문 ( Query Syntax ) 과 메서드 구문 ( Method Syntax )
- 질의 구문은 쿼리와 유사한 구조를 가지고 있다.
- 메서드 구문은 람다식의 형식 구조를 가지고 있다.
class MotoBike
{
public string name;
public int cc;
}
class Program
{
static void Main(string[] args)
{
List<MotoBike> motoBike = new List<MotoBike>
{
new MotoBike() {name ="cbr125", cc=122},
new MotoBike() {name ="ninja400", cc=399},
new MotoBike() {name ="cb650r", cc=648},
new MotoBike() {name ="hayabusa", cc=1340},
};
//query syntax
var queryResult = from bike in motoBike
where bike.cc > 100 && bike.cc < 700
orderby bick.cc ascending
select bike;
foreach(var result in queryResult)
{
Console.WriteLine($"바이크 : {result.name},
CC : {bike.cc} ");
}
//method syntax
var methodSyntax = motoBike.where(bike=> bike.cc > 100
&& bike.cc < 700)
.OrderBy(bike => bike.cc);
foreach(var result in queryResult)
{
Console.WriteLine($"바이크 : {result.name},
CC : {bike.cc} ");
}
}
}
//출력값
바이크 : cbr125 CC : 122
바이크 : ninja400 CC : 399
바이크 : cb650r CC : 648
- LINQ 의 IQueryable
- LINQ 의 질의 결과는 IEnumrable 이다, 그러므로 질의 완료 후 반환 된 데이터가 들어있는 객체를 반복 순회하며 데이터를 추출 할 수 있다.
- IQueryable 인터페이스는 System.Linq 에 정의 되어있으며 IEnumerable 의 자식 인터페이스이다.
- IEumerable 과 IQueryable 의 차이점
- IEumerable은 모든 데이터를 C# 내에서 가져와서 필터한다.
- IQueryable은 DataBase 에서 필터 된 데이터를 가져온다.
- 얻고자 하는 데이터가 C# 내부데이터라면 질의 결과를 얻기 위해 AsQueryable() 메서드를 호출해야 한다. 그게 아닌 DbSet 등 DataBase 관련 모델이라면 **AsQueryable()**을 호출할 필요가 없다.
class Program
{
static void Main(string[] args)
{
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r" };
IQueryable<string> linqResult = (from bike in bikeArr
where bike.Contains('3')
select bike).AsQueryable();
}
}
■ LINQ 의 메서드 종류와 기능 ( 내가 자주 쓸 것 같은 )
- Aggregate ( 집계 )
//초기값과 인자를 비교해 이름이 제일 긴 데이터를 추출
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
string longestName =
bikeArr.Arrgerate("R3",
(longest, next) =>
next.Length > longest.Length ? next : longest,
bike => bike.toUpper());
//결과
BENELI 502C
- ALL
// 모든 요소가 특정 조건과 맞는지 확인
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
bool allStartWithC = bikeArr.All(bike => bike.StartsWith("c"))
- Any
// 특정 요소가 특정 조건과 맞는지 확인
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
bool allStartWithC = bikeArr.Any(bike => bike.StartsWith("c"));
- Anerage
// 정수 값의 평균을 구함
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
double bikeStrLengthAvg= bikeArr.Average(bike => bike.Length);
- Cast
// IEnumerable 의 각 요소를 지정된 요소로 캐스팅한다.
ArrayList bikeArr = new()
{
"mt 03",
"mt 07",
"mt 09"
};
IEnumerable enumerable = bikeArr.Cast<string>();
- Concat
// 두 시퀸스를 특정 조건에 맞춰 연결한다.
Bike[] quarter = GetQuarterBike();
Bike[] middle = GetMiddleBike();
IEnumeratble<string> query = quarter.Select(bike => bike.name)
.Concat(middle.Select(bike => bike.name));
- Contains
// 시퀸스에서 조건에 다른 값이 있는 지 확인한다.
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
Console.WriteLine(bikeArr.Contains("duke 390"));
- Count
// 시퀸스의 요소들의 개수를 출력한다
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
Console.WriteLine(bikeArr.Count());
- DefaultIfEmpty
// 요소가 비어있다면 default 값을 채워넣는다
List<String> bikeArr = new();
bikeArr.Add("mt 03");
foreach(var item in bikeArr.DefaultIfEmpty("default"))
{
print(item);
}
//출력
mt 03
- DIstinct
// 중복된 항목을 제외하고 출력한다
string[] bikeArr = { "duke 390", "duke 390", "R3", "R3", "mt 03", "mt 03" };
foreach(var item in bikeArr.Distinct())
{
print(item);
}
//출력
duke 390
R3
mt 03
- ElementAtOrDefault
// 지정한 인덱스의 요소를 반환한다. 만약 인덱스의 범위를 벗어나면 기본값을 반환한다.
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
Console.WriteLine(bikeArr.ElementAtOrDefault(2));
//출력
ninja400
- Expect
// 두 요소의 차집합을 구한다.
string[] bikeArrA = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
string[] bikeArrB = { "duke 390","R3","ninja400","cb300r", "mt 03", "beneli 502c" };
Console.WriteLine(bikeArrA.Expect(bikeArrB));
- First, Last
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
// 스퀀스에서 주어진 조건에 따른 첫번째 요소를 반환한다.
string first = bikeArr.First(bike => bike.Length > 5);
// 스퀀스에서 주어진 조건에 따른 마지막 요소를 반환한다.
string first = bikeArr.Last(bike => bike.Length > 5);
Console.WriteLine(first);
- FirstOrDafault, LastOrDefault
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
// 스퀀스에서 주어진 조건에 따른 첫번째 요소를 반환한다, 없다면 기본 값을 반환
string first = bikeArr.First(bike => bike.Length < 0);
// 스퀀스에서 주어진 조건에 따른 마지막 요소를 반환한다, 없다면 기본 값을 반환
string first = bikeArr.LastOrDefault(bike => bike.Length < 0);
Console.WriteLine(first);
- Min , Max
string[] bikeArr = { "duke 390", "ninja400", "R3", "cb300r", "mt 03", "beneli 502c" };
// 스퀀스에서 주어진 조건에 최대값을 반환한다. 정수형으로
string first = bikeArr.Max(bike => bike.Length);
// 스퀀스에서 주어진 조건에 최소값을 반환한다. 정수형으로
string first = bikeArr.Min(bike => bike.Length);
Console.WriteLine(first);
- OrderBy
//정수형 데이터 기준 내림차순으로 정렬한다
Bike[] bikes = {new {name = "mt 03", cc=300}, new {name = "cb650r", cc = 648}};
IEnumberable<bike> query = bikes.OrderBy(bike => bike.cc);
foreach(var item in query)
{
Console.WriteLine("{0} - {1}", item.name, item.cc );
}
- OrderByDescending
//정수형 데이터 기준 오름차순으로 정렬한다
Bike[] bikes = {new {name = "mt 03", cc=300}, new {name = "cb650r", cc = 648}};
IEnumberable<bike> query = bikes.OrderBy(bike => bike.cc);
foreach(var item in query)
{
Console.WriteLine("{0} - {1}", item.name, item.cc );
}
참고 자료)
- https://ko.wikipedia.org/wiki/LINQ#:~:text=LINQ :: LINQ
- https://developer-talk.tistory.com/556 :: LINQ 란?
- https://developer-talk.tistory.com/558 :: 질의 구문과 메서드 구문
- https://doublsb.tistory.com/93 :: LINQ Method 정리
LIST
'Programming > c#' 카테고리의 다른 글
[C#] Blazor, MariaDb 연결 (0) | 2023.09.12 |
---|