UiPath_이론

LINQ 개론

ideas0123 2024. 9. 24. 17:29

https://forum.uipath.com/t/howto-linq-vb-net-learning-catalogue/325671

 

🥨 LINQ 정의

더보기

LINQ (Language-Integrated Query)는 .NET 언어(주로 C# 및 VB.NET)에 쿼리 기능을
통합하는 기능을 제공합니다. LINQ를 사용하면 데이터 소스에 대해 SQL과 유사한 구문을
사용하여 데이터를 쿼리할 수 있습니다. LINQ는 컬렉션, XML, SQL 데이터베이스,
ADO.NET 데이터 세트 등 다양한 데이터 소스를 대상으로 작동합니다.

 

💚 LINQ의 주요 기능

더보기

1. 표현식 기반 쿼리 작성

: LINQ 쿼리는 C# 코드 내부에서 작성되므로, 컴파일 타임에 구문 오류를 잡을 수 있습니다.
2. 강력한 형식 검사

: 쿼리 결과는 강력한 형식으로 반환되어, 타입 안정성과 IntelliSense 지원을 제공합니다.
3. 일관된 구문

: 다양한 데이터 소스에 대해 일관된 쿼리 구문을 사용하여 학습 곡선을 줄일 수 있습니다.
4. 확장 가능성

: 개발자는 자신만의 LINQ 제공자를 작성하여 사용자 정의 데이터 소스에 대해 LINQ를 사용할 수 있습니다.


💚 LINQ의 종류

더보기

1. LINQ to Objects

: 메모리 내의 컬렉션을 쿼리합니다. 예를 들어, List , Array 등.
2. LINQ to XML

: XML 문서를 쿼리합니다.
3. LINQ to SQL

: SQL 데이터베이스를 쿼리합니다. SQL Server와 같은 관계형 데이터베이스와 상호작용합니다.
4. LINQ to Entities

: Entity Framework를 사용하여 데이터베이스를 쿼리합니다.
5. LINQ to DataSet

: ADO.NET 데이터 세트를 쿼리합니다.


🥨 AsEnumerable 메서드의 사용

 

AsEnumerable 는 .NET LINQ의 확장 메서드 중 하나로,

주로 데이터 소스를 IEnumerable<T>로 캐스팅하는 데 사용됩니다.

 이 메서드는 컬렉션에 LINQ 쿼리를 적용할 수 있게 해줍니다.


[주요 용도]

더보기

1. 쿼리 구문을 활성화

: AsEnumerable 을 사용하면 데이터 소스가 IEnumerable<T> 로 취급되어 

LINQ 메서드(예: Where , Select , OrderBy 등)를 사용할 수 있습니다.
2. 메서드 체이닝

: AsEnumerable 을 사용하면 원래 데이터 소스의 메서드 체인을 계속 유지하면서

 중간에 LINQ 쿼리를 삽입할 수 있습니다.
3. 형 변환 방지

: 데이터 소스가 이미 IEnumerable<T> 를 구현하고 있는 경우,

AsEnumerable을 호출하면 단순히 형 변환을 수행하지 않고 원래 시퀀스를 반환합니다.

[기본 사용법]

더보기

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8,9, 10 };
// AsEnumerable을 사용하여 IEnumerable<int>로 캐스팅
IEnumerable<int> evenNumbers = numbers.AsEnumerable().Where(n => n % 2 == 0);
foreach (int number in evenNumbers)
{
Console.WriteLine(number);
}


이 예제에서는 List<int> 를 AsEnumerable 을 사용하여 IEnumerable<int> 로 캐스팅한 후,
Where 메서드를 사용하여 짝수를 필터링합니다.

[DataTable에서 사용]

더보기

DataTable의 행을 LINQ 쿼리로 필터링할 때도 AsEnumerable 을 사용할 수 있습니다.


Dim dataTable As DataTable = New DataTable()
dataTable.Columns.Add("Id", GetType(Integer))
dataTable.Columns.Add("Name", GetType(String))
dataTable.Rows.Add(1, "John")

dataTable.Rows.Add(2, "Jane")
dataTable.Rows.Add(3, "Doe")


' AsEnumerable을 사용하여 DataTable의 행을 IEnumerable(Of DataRow)로 캐스팅
Dim filteredRows As IEnumerable(Of DataRow) = dataTable.AsE
numerable().Where(Function(row) row.Field(Of Integer)("Id")> 1)


' 결과 출력
For Each row As DataRow In filteredRows
Console.WriteLine(row.Field(Of String)("Name"))
Next


이 예제에서는 DataTable 의 행을 AsEnumerable 을 사용하여 IEnumerable(Of DataRow) 로 캐스
팅한 후, Where 메서드를 사용하여 Id 값이 1보다 큰 행을 필터링합니다.

[요약]

더보기

AsEnumerable 은 데이터 소스를 IEnumerable<T> 로 캐스팅하여 LINQ 쿼리를 사용할 수있게 합니다.
데이터 소스가 이미 IEnumerable<T> 를 구현하고 있다면, AsEnumerable 은 시퀀스를 그대로 반환합니다.
주로 List , DataTable 등의 컬렉션에 LINQ 쿼리를 적용할 때 사용됩니다.
이 메서드를 사용하면 컬렉션의 데이터를 손쉽게 쿼리하고 조작할 수 있어

코드의 가독성과 유지보수성을 높일 수 있습니다.

 

🥨 LINQ 대표 연산자 (DataTable)


1. Where 연산자

DataTable의 특정 조건을 만족하는 행들을 필터링합니다.

더보기

DataTable filteredTable = dataTable.AsEnumerable()

.Where(row => row.Field<int>("Column1") > 10).CopyToDataTable();

2. Select 연산자

DataTable의 행을 변환하여 새로운 형식으로 선택합니다.

더보기

var result = dataTable.AsEnumerable()
.Select(row => new{
Column1 = row.Field<int>("Column1"),
Column2 = row.Field<string>("Column2")
});

3. OrderBy 및 OrderByDescending 연산자

DataTable의 행을 특정 열을 기준으로 정렬합니다.

더보기

DataTable sortedTable = dataTable.AsEnumerable()

.OrderBy(row => row.Field<string>("Column1")).CopyToDataTable();

내림차순 정렬

더보기

DataTable sortedTableDesc = dataTable.AsEnumerable()
.OrderByDescending(row=> row.Field<string>("Column1")).CopyToDataTable();

4. GroupBy 연산자

DataTable의 행을 특정 열을 기준으로 그룹화합니다.

더보기

var groupedData = dataTable.AsEnumerable()
.GroupBy(row => row.Field<string>("Column1")).Select(g => new
{
Key = g.Key,
Count = g.Count()
});

5. Join 연산자

두 개의 DataTable을 특정 열을 기준으로 조인합니다.

더보기

var joinedData = from row1 in dataTable1.AsEnumerable()
join row2 in dataTable2.AsEnumerable()on row1.Field<int>("Id") equals row2.Field<int>("Id")
select new

{
Column1 = row1.Field<string>("Column1"),
Column2 = row2.Field<string>("Column2")
};

6. Any 연산자

DataTable에 특정 조건을 만족하는 행이 있는지 확인합니다.

더보기

bool hasAny = dataTable.AsEnumerable()
.Any(row => row.Field<int>("Column1") > 10);

7. All 연산자

DataTable의 모든 행이 특정 조건을 만족하는지 확인합니다.

더보기

bool allMatch = dataTable.AsEnumerable()
.All(row => row.Field<int>("Column1") > 10);

8. Aggregation 연산자 (Sum, Average, Count 등)

DataTable의 열 값에 대해 집계 연산을 수행합니다.

더보기

int sum = dataTable.AsEnumerable()
.Sum(row => row.Field<int>("Column1"));
double average = dataTable.AsEnumerable()
.Average(row => row.Field<int>("Column1"));
int count = dataTable.AsEnumerable()
.Count(row => row.Field<int>("Column1") > 10);

9. Distinct 연산자

DataTable의 특정 열의 중복 값을 제거합니다.

더보기

var distinctValues = dataTable.AsEnumerable()
.Select(row => row.Field<string>("Column1"))
.Distinct();

10. CopyToDataTable 연산자

LINQ 쿼리 결과를 다시 DataTable로 변환합니다. 위에서 사용한 것처럼,
.CopyToDataTable() 메서드를 사용합니다.


[예제 코드]
UiPath에서 DataTable을 사용한 LINQ 쿼리 예제는 다음과 같이 작성할 수 있습니다.

더보기

' Assign: dataTable (DataTable 변수)
Dim filteredTable As DataTable = dataTable.AsEnumerable() _
.Where(Function(row) row.Field(Of Integer)("Column1") > 10) _
.CopyToDataTable()

' Assign: result (IEnumerable(Of Object) 변수)
Dim result = dataTable.AsEnumerable() _
.Select(Function(row) New With { _
Key .Column1 = row.Field(Of Integer)("Column1"), _
Key .Column2 = row.Field(Of String)("Column2") _
}).ToList()


' Assign: sortedTable (DataTable 변수)
Dim sortedTable As DataTable = dataTable.AsEnumerable() _
.OrderBy(Function(row) row.Field(Of String)("Column1")) _
.CopyToDataTable()

이 예제에서는 LINQ를 사용하여 DataTable의 데이터를 필터링, 변환 및 정렬하는 방법을
보여줍니다. UiPath에서 LINQ를 활용하면 복잡한 데이터 처리 작업을 간결하고 효율적으
로 수행할 수 있습니다.

 


🥨 LINQ 대표 연산자 (Collection)

UiPath에서 LINQ를 사용하여 컬렉션을 다루는 방법은 매우 유용하며, 여러 가지 대표적인
연산자를 사용할 수 있습니다. 다음은 UiPath에서 컬렉션에 사용할 수 있는 대표적인 LINQ
연산자들입니다.


1. Where 연산자

컬렉션의 특정 조건을 만족하는 요소들을 필터링합니다.

더보기

<예제>

 List(Of Integer)에서 짝수만 필터링
Dim numbers As List(Of Integer) = New List(Of Integer)({1,2, 3, 4, 5, 6, 7, 8, 9, 10})

Dim evenNumbers As IEnumerable(Of Integer) = numbers.Where(Function(n) n Mod 2 = 0)

2. Select 연산자

컬렉션의 각 요소를 변환하여 새로운 형식으로 선택합니다.

더보기

<예제>

 List(Of Integer)의 각 요소를 제곱
Dim squaredNumbers As IEnumerable(Of Integer) = numbers.Select(Function(n) n * n)

3. OrderBy 및 OrderByDescending 연산자

컬렉션의 요소를 특정 키를 기준으로 정렬합니다.

더보기

<예제>

- List(Of String)을 알파벳 순으로 정렬
Dim words As List(Of String) = New List(Of String)({"apple", "banana", "cherry", "date"})
Dim orderedWords As IEnumerable(Of String) = words.OrderBy(Function(w) w)


- 내림차순 정렬
Dim orderedWordsDesc As IEnumerable(Of String) = words.OrderByDescending(Function(w) w)

4. GroupBy 연산자

컬렉션의 요소를 특정 키를 기준으로 그룹화합니다.

더보기

<예제>

List(Of String)을 길이를 기준으로 그룹화
Dim groupedWords = words.GroupBy(Function(w) w.Length).Sele
ct(Function(g) New With {Key .Length = g.Key, Key .Words =g.ToList()})

5. Join 연산자

두 개의 컬렉션을 특정 키를 기준으로 조인합니다.

더보기

<예제>

 두 개의 List(Of Person)을 ID를 기준으로 조인
Dim people As List(Of Person) = New List(Of Person)({
New Person With {.Id = 1, .Name = "John"},
New Person With {.Id = 2, .Name = "Jane"}
})
Dim pets As List(Of Pet) = New List(Of Pet)({
New Pet With {.Name = "Rex", .OwnerId = 1},
New Pet With {.Name = "Spot", .OwnerId = 2}
})
Dim joined = people.Join(pets, Function(person) person.Id,
Function(pet) pet.OwnerId,
Function(person, pet) New With
{Key person.Name, Key pet.Name})

6. Any 연산자

컬렉션에 특정 조건을 만족하는 요소가 하나라도 있는지 확인합니다.

더보기

<예제>

List(Of Integer)에 짝수가 있는지 확인
Dim hasEven As Boolean = numbers.Any(Function(n) n Mod 2 =0)

7. All 연산자

컬렉션의 모든 요소가 특정 조건을 만족하는지 확인합니다.

더보기

<예제>

 List(Of Integer)의 모든 요소가 짝수인지 확인
Dim allEven As Boolean = numbers.All(Function(n) n Mod 2 =0)

8. Aggregation 연산자 (Sum, Average, Count 등)

컬렉션의 요소들에 대해 집계 연산을 수행합니다.

더보기

<예제>

List(Of Integer)의 요소들에 대해 집계 연산 수행
Dim sum As Integer = numbers.Sum()

Dim average As Double = numbers.Average()
Dim count As Integer = numbers.Count()

9. Distinct 연산자

컬렉션의 중복된 요소를 제거합니다.

더보기

<예제>

List(Of Integer)의 중복된 요소 제거
Dim distinctNumbers As IEnumerable(Of Integer) = numbers.Distinct()

10. ToList 및 ToArray 연산자

LINQ 쿼리 결과를 List 또는 Array로 변환합니다.

더보기

<예제>

 LINQ 쿼리 결과를 List로 변환
Dim evenNumbersList As List(Of Integer) = evenNumbers.ToList()


<예제>

 LINQ 쿼리 결과를 Array로 변환
Dim evenNumbersArray As Integer() = evenNumbers.ToArray()

[예제 코드 (UiPath에서 사용)]

아래는 UiPath에서 컬렉션을 사용한 LINQ 쿼리 예제입니다.

더보기

' 변수 정의
Dim numbers As List(Of Integer) = New List(Of Integer)({1,2, 3, 4, 5, 6, 7, 8, 9, 10})

' Where 연산자 예제: 짝수 필터링
Dim evenNumbers As IEnumerable(Of Integer) = numbers.Where(Function(n) n Mod 2 = 0)
' Select 연산자 예제: 각 요소를 제곱
Dim squaredNumbers As IEnumerable(Of Integer) = numbers.Select(Function(n) n * n)
' OrderBy 연산자 예제: 오름차순 정렬

Dim orderedNumbers As IEnumerable(Of Integer) = numbers.OrderBy(Function(n) n)
' GroupBy 연산자 예제: 길이 기준 그룹화
Dim words As List(Of String) = New List(Of String)({"apple", "banana", "cherry", "date"})
Dim groupedWords

= words.GroupBy(Function(w)w.Length).Select(Function(g) New With {Key .Length = g.Key, Key .Words =g.ToList()})
' Join 연산자 예제: 두 개의 컬렉션 조인
Dim people As List(Of Person) = New List(Of Person)({
New Person With {.Id = 1, .Name = "John"},
New Person With {.Id = 2, .Name = "Jane"}
})
Dim pets As List(Of Pet) = New List(Of Pet)({
New Pet With {.Name = "Rex", .OwnerId = 1},
New Pet With {.Name = "Spot", .OwnerId = 2}
})
Dim joined = people.Join(pets, Function(person) person.Id,
Function(pet) pet.OwnerId,
Function(person, pet) New With
{Key person.Name, Key pet.Name})

이 예제는 UiPath에서 LINQ를 사용하여 컬렉션의 데이터를 필터링, 변환, 정렬, 그룹화 및
조인하는 방법을 보여줍니다. LINQ는 복잡한 데이터 조작 작업을 간결하고 효율적으로 수행
할 수 있게 해줍니다.

'UiPath_이론' 카테고리의 다른 글

변수 - 딕셔너리  (0) 2024.09.27
정규표현식(Regular Expression)  (1) 2024.09.25
서울의 날씨 / 링큐문  (2) 2024.09.23
예외처리 - Try Catch  (1) 2024.09.20
예외처리 - 기본 / Retry  (1) 2024.09.19