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 |