DataEngine vs LINQ - 데이터 변환
페이지 정보
작성자 GrapeCity 작성일 2020-07-17 00:00 조회 4,473회 댓글 0건본문
관련링크
DataEngine 라이브러리에는 데이터 분석 및 탐색을 가속화하는 열 지향적 파일 기술 및 메모리 매핑 파일 기술과 같이 즉시 사용 가능한 비즈니스 인텔리전스 기능이 있습니다. (C1DataEngine)은 비즈니스 요구 사항과 관련이 있으므로 여러 소스의 데이터를 변환하는 데 도움을 줍니다.
그럴듯하게 들리지만, DataEngine이 나오기 전에는 어떻게 했을까요? LINQ, IEnumerable 메서드 또는 SQL을 조합했을 가능성이 가장 큽니다. ComponentOne DataEngine은 데이터 변환을 더 쉽게 할 의도로 만들어진 것은 아닙니다(일부 상황에서는 실제로 그러하지만). LINQ는 C# 언어에 바로 통합된 쿼리 기능 집합이며, 데이터 변환을 매우 쉽게 만드는 데 크게 일조했습니다. DataEngine의 진정한 가치는 일체형 작업 영역 방법론 및 LINQ에 비해 개선된 성능에서 확인할 수 있습니다.
이 게시글에서는 ComponentOne DataEngine을 사용하여 공통 데이터 변환을 어떻게 수행하는지를 모두에게 친숙한 공통 솔루션인 LINQ 쿼리와 비교하여 설명하겠습니다. 데이터를 선택, 그룹화 및 필터링하여 일부 공통 데이터 변환을 해결하는 과정을 살펴봅니다.
JSON 연결 및 선택
우선 JSON 데이터를 공용 Northwind OData 서비스에서 쿼리 가능한 개체 컬렉션으로 가져오겠습니다. 이 단계는 LINQ, IEnumerable 메서드, C1DataEngine 중 어떤 것을 사용하든 동일합니다.
이 코드는 Newtonsoft.Json 라이브러리를 사용하여 JSON 데이터를 구문 분석하고 사용자 정의 Invoice 개체 목록에 채웁니다. 유사한 샘플을 하거나 .
// get NorthWind Invoice JSON data WebClient wc = new WebClient(); string download = wc.DownloadString("https://services.odata.org/v4/Northwind/Northwind.svc/Invoices"); JObject root = JObject.Parse(download); JArray values = (JArray)root["value"]; List<Invoice> collection = JsonConvert.DeserializeObject<List<Invoice>>(values.ToString());
DataEngine 작업 영역 만들기
LINQ 또는 표준 데이터 변환 기술을 사용하는 경우에는 각 변환 및 이를 통해 생성된 컬렉션에 대한 관리를 책임져야 합니다. 다시 말하면 데이터가 메모리에 저장되는 방식을 효율적으로 관리해야 합니다.
DataEngine에서는 앱이 사용자에게 요구하는 각종 쿼리를 모두 ‘workspace’ 패러다임을 사용하여 유지하고 관리합니다. 이를 위해 시작 부분에 코드 몇 줄이 추가로 필요하지만 그럴 만한 가치가 있습니다. 작업 영역에는 메타데이터를 저장하기 위한 로컬 파일 공간(앱에 따라 다름)이 있어 열 매핑 및 캐싱에 도움을 주며, 더 많은 작업 데이터의 성능을 개선합니다.
다음은 작업 공간을 설정하는 데 필요한 코드입니다.
string path = "workspace"; // absolute or relative path to the workspace folder Workspace workspace = new Workspace(); workspace.Init(path); workspace.Clear();
가져온 사용자 정의 개체 컬렉션에 DataEngine을 연결하려면 매개 변수를 생성자에 연결하는 것처럼 ObjectConnector 클래스의 인스턴스를 만들고 Workspace 개체 및 앞에서 초기화된 사용자 정의 컬렉션을 전달합니다. GetData 메서드는 가져온 데이터를 포함하는 DataEngine 테이블을 만듭니다.
var connector = new ObjectConnector<Invoice>(workspace, collection); connector.GetData("Invoices"); workspace.Save();
작업 공간을 비우고 저장하면 변경 내용이 로컬 저장된 파일에 커밋됩니다.
LINQ 및 DataEngine에서 쿼리 그룹화
연결이 되었으면, 다음 단계는 데이터를 그룹화하고 양을 집계하는 것입니다. LINQ를 사용하는 경우에는 그룹화하고 집계하려는 필드에서 group 연산자와 sum 확장자를 사용합니다. 이 연산으로 새 목록이 생성되므로, 전체 데이터 집합에서 새로 그룹화된 데이터 집합으로 가져오려는 열도 모두 지정해야 합니다.
이 코드는 Salesperson별로 그룹화되고 LINQ를 사용하여 ExtendedPrice 필드를 집계합니다. 그런 다음에 목록으로 변환되면 데이터 그리드를 채울 수 있습니다.
var results = (from inv in collection group inv by inv.Salesperson into g select new Invoice { Salesperson = g.Key, ExtendedPrice = g.Sum(pc => pc.ExtendedPrice) }).ToList();
DataEngine을 사용하는 경우에도 유사한 기술을 사용하게 되지만, 새 개체 목록을 정의할 필요는 없습니다. 대신 새로운 작업 공간 뷰를 정의하고 이름을 “SalesByEmployee”로 지정합니다. 이 뷰는 두 가지 필드로 정의됩니다. 즉 ExtendedPrice 값의 합계인 Salesperson 및 Sales입니다.
dynamic invoices = workspace.table("Invoices"); dynamic query = workspace.query("SalesByEmployee", new { invoices.Salesperson, Sales = Op.Sum(invoices.ExtendedPrice) }); query.Query.Execute();
LINQ 및 C1DataEngine 예제 모두에서 집계 메서드의 사용 방법은 유사하지만, 결정적 차이는 DataEngine이 작업 공간 쿼리를 정의하고 있다는 점입니다. 그것이 추가 뷰의 정의를 아주 쉽게 만듭니다. 예를 들어 고유한 Salesperson 및 Country 페어링을 각각 그룹화하도록 그룹을 수정해 보겠습니다. 그러면 각 country.Using DataEngine별로 각자 판매한 총계를 알 수 있으므로, 새 쿼리를 작업 공간에 추가하고(이때 이름은 “SalesByEmployeeCountry”) Country 필드를 쉽게 추가할 수 있습니다. DataEngine은 지금은 더 복잡해진 그룹화 로직을 처리합니다.
dynamic query = workspace.query("SalesByEmployeeCountry", new { invoices.Salesperson, invoices.Country, Sales = Op.Sum(invoices.ExtendedPrice) }); query.Query.Execute();
DataEngine의 쿼리로 데이터 그리드를 채우기 위해 작업 공간에서 GetQueryData를 호출하고 여기서 필요한 쿼리를 쉽게 바꿉니다.
dataGridView1.DataSource = workspace.GetQueryData("SalesByEmployeeCountry");
LINQ를 사용하여 같은 작업을 수행할 수 있을까요? LINQ 쿼리에서 개체별로 더 복잡한 그룹을 정의하면 가능합니다. 이것은 더 복잡해지기 시작하는 지점입니다. 구문에서만 참조(Google 검색)가 필요합니다. 따라서 어떤 면에서는 DataEngine이 복잡한 변환을 더 쉽게 코드화할 수 있도록 만듭니다.
var results = (from inv in invoices group inv by new { inv.Salesperson, inv.Country } into g select new Invoice { Salesperson = g.Key.Salesperson, Country = g.Key.Country, ExtendedPrice = g.Sum(pc => pc.ExtendedPrice) }).ToList(); dataGridView1.DataSource = results;
LINQ 및 DataEngine에서 쿼리 필터링
한 특정 국가(영국)에 대한 레코드만 표시하기 위해 데이터 집합에 대해 다음으로 수행하려는 데이터 변환은 필터입니다.
LINQ를 사용하는 경우에는 아래와 같이 where 연산자를 group 연산자 앞에 추가합니다.
var results = (from inv in invoices where inv.Country.Equals("UK") group inv by new { inv.Salesperson, inv.Country } into g select new Invoice { Salesperson = g.Key.Salesperson, Country = g.Key.Country, ExtendedPrice = g.Sum(pc => pc.ExtendedPrice) }).ToList();
DataEngine을 사용하여 필터를 설정하기 위해 아래와 같이 다시 새 이름으로 쿼리를 정의하고 _filter 구성원을 설정합니다. 쿼리의 이름은 “SalesByEmployeeUK”처럼 적절히 지정되며, 앞의 예제와 같이 Salesperson, Country별로 그룹화되고 ExtendedPrice를 집계합니다.
dynamic query = workspace.query("SalesByEmployeeUK", new { \_filter = invoices.Country.Eq("UK"), invoices.Salesperson, invoices.Country, Sales = Op.Sum(invoices.ExtendedPrice) });
DataEngine 필터링은 ColumnCondition 클래스의 And 메서드뿐만 아니라 Or 메서드를 사용하여 수행할 수 있습니다. 이로써 더 복잡한 필터를 빌드할 수 있습니다.
예: _filter = invoices.Country.Eq("UK").Or().Eq("Spain")
LINQ 및 DataEngine에 대한 결론
댓글목록
등록된 댓글이 없습니다.