SQL, LINQ, ADO.NET을 사용하여 C#에서 JSON을 쿼리하는 방법
페이지 정보
작성자 MESCIUS 작성일 2023-11-23 10:41 조회 143회 댓글 0건본문
관련링크
이번 블로그에서는 ADO.NET 또는 Entity Framework Core를 사용하여 JSON 데이터에 가장 쉽게 연결하는 방법을 제공하는 에 대해 알아보겠습니다.
ComponentOne의 JSON용 ADO에 대해 이야기하고, NET 공급자를 사용하여 SQL과 LINQ로 JSON 데이터를 쿼리하는 방법을 설명하겠습니다!
SQL을 사용하여 JSON을 쿼리하는 방법
이 프로세스에서는 데이터베이스로 작업할 때 일반적으로 사용하는 것과 동일한 접근 방식을 따릅니다.
먼저, 필요한 NuGet 패키지를 설치해 봅시다.
프로젝트 메뉴를 열고 NuGet 패키지 관리를 선택합니다.
'C1.AdoNet.Json' NuGet 패키지를 찾은 다음, 설치를 클릭합니다.
연결 문자열 만들기
데이터 소스에 연결하려면 연결 문자열이 필요합니다.
를 사용하여 연결 문자열을 만들겠습니다.
연결 문자열을 만들려면 다음 세 가지 항목이 필요합니다.
JSON DataModel: JSON 데이터를 읽는 데 사용되는 액세스 메커니즘을 지정합니다. DataModel을 지정하면 개체 배열이 테이블로 모델링되는 방식을 구성할 수 있습니다. 사용 가능한 데이터 모델은 최상위 문서 모델, 평면 모델, 관계형 모델 등 다양합니다. 자세한 내용은 문서를 확인해 주세요!
Uri: JSON 리소스 위치의 URI를 지정합니다. 로컬 파일이나 HTTP 스트림에 연결할 수 있습니다.
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" }; } }
연결 문자열 형식에 대한 자세한 내용은 문서를 참고해 주세요!
연결 개체 만들기
다음 단계는 클래스를 사용하여 연결 인스턴스를 초기화하는 것입니다.
private void CreateJsonConnection() { _jsonConnection = new C1JsonConnection(_connBuilder.ConnectionString); }
SQL로 데이터 쿼리
연결이 준비되었으므로 의 개체를 만들어 SQL로 데이터를 쿼리할 수 있습니다.
C1JsonDataAdapter adapter = new C1JsonDataAdapter(_jsonConnection, sql); var table = new DataTable(); adapter.Fill(table);
다음은 샘플 평면 데이터와 이에 대한 쿼리입니다.
C1JsonDataAdapter adapter = new C1JsonDataAdapter(_jsonConnection, “select * from employees”); var table = new DataTable(); adapter.Fill(table);
관계형 데이터의 경우 다음과 같이 보입니다.
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을 채우고 나면 그리드에 데이터가 표시됩니다.
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() });
데이터는 하단과 같이 그리드/차트에서 사용할 수 있습니다.
결론
우리는 ComponentOne의 JSON용 ADO. NET 공급자를 사용하여 평면/관계형 JSON 데이터를 쿼리하는 방법을 살펴보았습니다.
블로그에는 JSON용 ADO. NET 공급자의 기본 사용법이 나와 있지만, 이 라이브러리에서는 Authorization(권한 부여), Caching(캐싱), Connection Pooling(연결 폴링) 등의 고급 기능도 제공하고 있습니다.
자세한 내용은 제품 설명서를 참조해 주시길 바랍니다.
지금 바로 ComponentOne을 다운로드하여 직접 테스트해 보세요!
댓글목록
등록된 댓글이 없습니다.