! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

SQL, LINQ, ADO.NET을 사용하여 C#에서 JSON을 쿼리하는 방법 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

SQL, LINQ, ADO.NET을 사용하여 C#에서 JSON을 쿼리하는 방법

페이지 정보

작성자 MESCIUS 작성일 2023-11-23 10:41 조회 139회 댓글 0건

본문

오늘날의 연결된 세상에서는 데이터가 빠른 속도로 쌓입니다.


우리는 인류 역사상 그 어느 때보다 많은 데이터를 생성하고 있으며, 이 데이터 중 상당수가 JSON 문서 같은 비관계형 형식으로 저장되고 있습니다.


최신 응용 프로그램에서 흔하게 사용되는 JSON 형식은 구성 파일, API 간 데이터 전송, 클라이언트 및 서버, 데이터 스토리지 등에 사용됩니다.


JSON 데이터로 작업하는 것 역시 간단합니다.


이번 블로그에서는 ADO.NET 또는 Entity Framework Core를 사용하여 JSON 데이터에 가장 쉽게 연결하는 방법을 제공하는 JSON용 ComponentOne DataConnector에 대해 알아보겠습니다.


ComponentOne의 JSON용 ADO에 대해 이야기하고, NET 공급자를 사용하여 SQL과 LINQ로 JSON 데이터를 쿼리하는 방법을 설명하겠습니다!



SQL을 사용하여 JSON을 쿼리하는 방법


이 프로세스에서는 데이터베이스로 작업할 때 일반적으로 사용하는 것과 동일한 접근 방식을 따릅니다.

  1. 연결 문자열 만들기

  2. 연결 개체 만들기

  3. SQL로 데이터 쿼리


먼저, 필요한 NuGet 패키지를 설치해 봅시다.

  • 프로젝트 메뉴를 열고 NuGet 패키지 관리를 선택합니다.

  • 'C1.AdoNet.Json' NuGet 패키지를 찾은 다음, 설치를 클릭합니다.

   

연결 문자열 만들기


데이터 소스에 연결하려면 연결 문자열이 필요합니다.


C1JsonConnectionStringBuilder를 사용하여 연결 문자열을 만들겠습니다.


연결 문자열을 만들려면 다음 세 가지 항목이 필요합니다.

  1. JSON DataModel: JSON 데이터를 읽는 데 사용되는 액세스 메커니즘을 지정합니다. DataModel을 지정하면 개체 배열이 테이블로 모델링되는 방식을 구성할 수 있습니다. 사용 가능한 데이터 모델은 최상위 문서 모델, 평면 모델, 관계형 모델 등 다양합니다. 자세한 내용은 문서를 확인해 주세요!

  2. Uri: JSON 리소스 위치의 URI를 지정합니다. 로컬 파일이나 HTTP 스트림에 연결할 수 있습니다.

  3. JSON 경로: JSON 콘텐츠에서 읽을 노드를 지정합니다.


다음은 평면 데이터의 연결 문자열을 만드는 예제입니다.

public static class Utils
{
        public static string JsonDataPath => "Data\\EmployeesData.json";
        public static C1JsonConnectionStringBuilder JsonConnectionBuilder { get; }

        static Utils()
        {
            JsonConnectionBuilder = new C1JsonConnectionStringBuilder()
            {
                DataModel = "Document",
                Uri = JsonDataPath,
                JsonPath = "$.employees"
            };
        }
}


관계형 데이터의 연결 문자열을 만드는 예제입니다.

public static class Utils
{
        public static string JsonCustomerDataPath => "Data\\CustomersData.json";
        public static C1JsonConnectionStringBuilder CustomerDataConnectionStringBuilder { get; }

        static Utils()
        {
            CustomerDataConnectionStringBuilder = new C1JsonConnectionStringBuilder()
            {
                DataModel = "Relational",
                Uri = JsonCustomerDataPath,
                JsonPath = "$.customers;$.customers.Transactions"
            };
        }
}


연결 문자열 형식에 대한 자세한 내용은 문서를 참고해 주세요!

 

연결 개체 만들기


다음 단계는 C1JsonConnection 클래스를 사용하여 연결 인스턴스를 초기화하는 것입니다.

private void CreateJsonConnection()
{
_jsonConnection = new C1JsonConnection(_connBuilder.ConnectionString);
}

 

SQL로 데이터 쿼리


연결이 준비되었으므로 C1JsonDataAdapter의 개체를 만들어 SQL로 데이터를 쿼리할 수 있습니다.

C1JsonDataAdapter adapter = new C1JsonDataAdapter(_jsonConnection, sql);
var table = new DataTable();
adapter.Fill(table);


다음은 샘플 평면 데이터와 이에 대한 쿼리입니다.

SQL, LINQ, ADOdotNET으로 JSON 데이터를 쿼리하는 방법 

C1JsonDataAdapter adapter = new C1JsonDataAdapter(_jsonConnection, “select * from employees”);
var table = new DataTable();
adapter.Fill(table);


관계형 데이터의 경우 다음과 같이 보입니다.

SQL, LINQ, ADOdotNET으로 JSON 데이터를 쿼리하는 방법 

C1JsonDataAdapter adapter = new C1JsonDataAdapter(_jsonConnection, (“Select FirstName, LastName, Amount from customers INNER JOIN Transactions ON customers._id = Transactions.customers_id where Transactions.IsSuccess=false”);
var table = new DataTable();
adapter.Fill(table);


DataTable을 채우고 나면 그리드에 데이터가 표시됩니다.

SQL, LINQ, ADOdotNET으로 JSON 데이터를 쿼리하는 방법



Entity Framework Core에서 LINQ로 JSON 쿼리하기


이번 섹션에서는 Entity Framework Core에서 LINQ를 사용하여 JSON 데이터를 쿼리하는 방법에 대해 알아보겠습니다.


필요한 NuGet 패키지인 C1.EntityFrameworkCore.Json을 설치해 봅시다.


NuGet 패키지가 설치된 다음에는 DbContext를 설정하고 JSON 데이터 소스에 연결 문자열을 제공해야 합니다.


C1JsonConnectionStringBuilder를 아래와 같이 사용하겠습니다.

public abstract partial class DocumentContext : DbContext
{
        private C1JsonConnectionStringBuilder _builder;

        public DocumentContext(C1JsonConnectionStringBuilder builder)
        {
            _builder = builder;
            Database.AutoTransactionsEnabled = false;
        }

        public DocumentContext(DbContextOptions<DocumentContext> options)
            : base(options)
        {
            Database.AutoTransactionsEnabled = false;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseJson(_builder.ConnectionString);
            }
        }
}



DbContext를 만드는 방법


상단의 DocumentContext 클래스는 JSON 문서의 DbContext에 대한 기본 클래스 역할을 합니다.


자식 클래스에서 모델 엔터티를 정의할 수 있습니다.


평면 JSON 데이터 소스의 DbContext 예제입니다.

public class EmployeesContext : DocumentContext
{
        public virtual DbSet<Employee> Employees { get; set; }

        public EmployeesContext() : base(Utils.JsonConnectionBuilder) { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Employee>(entity =>
            {
                entity.ToTable("employees");
                entity.HasKey(x => x.Id);
                entity.Property(e => e.Id).HasColumnName("Id");
                entity.Property(e => e.FirstName).HasColumnName("FirstName");
                entity.Property(e => e.LastName).HasColumnName("LastName");
                entity.Property(e => e.Email).HasColumnName("Email");
                entity.Property(e => e.DOB).HasColumnName("DOB");
                entity.Property(e => e.Address).HasColumnName("Address");
                entity.Property(e => e.State).HasColumnName("State");
                entity.Property(e => e.Company).HasColumnName("Company");
                entity.Property(e => e.Gender).HasColumnName("Gender");
                entity.Property(e => e.JobTitle).HasColumnName("JobTitle");
                entity.Property(e => e.Skill).HasColumnName("Skill");
                entity.Property(e => e.Salary).HasColumnName("Salary");
            });
        }
}


관계형 JSON 데이터 소스의 DbContext 예제입니다.

public class CustomersContext : DocumentContext
{
        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<Transaction> Transactions { get; set; }

        public CustomersContext() : base(Utils.CustomerDataConnectionStringBuilder) { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Transaction>(entity =>
            {
                entity.ToTable("Transactions");
                entity.HasOne(e => e.Customer).WithMany(x => x.Transactions).HasForeignKey("customers_id");
                entity.Property(e => e.Id).HasColumnName("_id");
                entity.Property(e => e.Amount).HasColumnName("Amount");
                entity.Property(e => e.Credited).HasColumnName("Credited");
                entity.Property(e => e.IsSuccess).HasColumnName("IsSuccess");
                entity.Property(e => e.Date).HasColumnName("Date");
            });

            modelBuilder.Entity<Customer>(entity =>
            {
                entity.ToTable("customers");
                entity.Property(e => e.Id).HasColumnName("_id");
                entity.Property(e => e.FirstName).HasColumnName("FirstName");
                entity.Property(e => e.LastName).HasColumnName("LastName");
                entity.Property(e => e.DOB).HasColumnName("DOB");
                entity.Property(e => e.State).HasColumnName("State");
                entity.Property(e => e.Gender).HasColumnName("Gender");
            });
        }
}


ComponentOne DataConnectors 스캐폴딩 기능을 사용하면 이러한 클래스를 자동으로 생성할 수 있습니다.


Scaffold-DbContext 명령을 실행하여 생성합니다.


자세한 내용은 스캐폴딩 항목을 참조해 주세요!



LINQ로 DbContext 쿼리하기


DbContext를 설정했으므로 LINQ를 사용하여 JSON 데이터 소스를 쿼리할 수 있습니다.


쿼리 구문이나 메서드 구문을 둘 다 사용할 수 있습니다.

_context = new EmployeesContext();
var employees = await _context.Employees.ToListAsync();

// Employee count of companies starting with 'A'
var employeeCountData = from employee in employees
                        where employee.Company.StartsWith("A", StringComparison.OrdinalIgnoreCase)
                        group employee by employee.Company into grp
                        select new { Company = grp.Key, NumberOfEmployees = grp.Count() };

// Salary growth of people working in Dynabox
var salaryGrowthData = employees
         .Where(x => x.Company == "Dynabox").OrderBy(x => x.DOB)
         .Select(x => new { Age = DateTime.Now.Year - x.DOB.Year, Salary = x.Salary })
         .Where(x => x.Age >= 18)
         .GroupBy(x => x.Age)
         .Select(x => new { Age = x.Key, AverageSalary = x.Select(o => o.Salary).Average() });


데이터는 하단과 같이 그리드/차트에서 사용할 수 있습니다.

SQL, LINQ, ADOdotNET으로 JSON 데이터를 쿼리하는 방법



결론


우리는 ComponentOne의 JSON용 ADO. NET 공급자를 사용하여 평면/관계형 JSON 데이터를 쿼리하는 방법을 살펴보았습니다.


블로그에는 JSON용 ADO. NET 공급자의 기본 사용법이 나와 있지만, 이 라이브러리에서는 Authorization(권한 부여), Caching(캐싱), Connection Pooling(연결 폴링) 등의 고급 기능도 제공하고 있습니다.


자세한 내용은 제품 설명서를 참조해 주시길 바랍니다.


설명서 바로 가기 | 샘플 다운로드 페이지 가기


 




지금 바로 ComponentOne을 다운로드하여 직접 테스트해 보세요!

c1.png

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.