.NET 앱의 JSON 데이터 소스에서 수백만 개의 행을 로드하는 방법

ComponentOne DataConnectors은 효율적인 데이터 통신을 위해 서로 다른 데이터 소스에 액세스하기 위한 통합 인터페이스를 제공하는 ADO.NET 기반 서비스 구성 요소입니다. 데이터 기반 앱을 개발하는 데 필요한 시간을 단축합니다. 현재 JSON 데이터 소스의 사용은 현재 응용 프로그램을 바인딩하는 데 점점 보편화되고 있으며 GrapeCity는 ADO.NET 또는 EntityFramework Core를 사용하여 JSON 데이터에 쉽게 액세스할 수 있는 DataConnector for JSON을 제공합니다. JSON 데이터로 작업하는 프로세스를 단순화하고 평면 및 관계형 JSON 데이터를 모두 쿼리할 수 있는 기능을 제공합니다.

일반적으로 JSON에 엄청난 수의 레코드가 있는 경우(예: 수백만 개) 데이터를 반복하여 할당하는 데 시간이 오래 걸리지만 JSON DataConnector를 사용하면 몇 번에 데이터만큼 로드할 수 있습니다. 초이며 현재 이 기능은 Top level Document Model을 통해서만 사용할 수 있습니다.

이 블로그에서는 ADO.NET Provider for JSON을 사용하여 수백만 개의 레코드를 FlexGrid에 매우 빠르게 로드하는 방법을 알아보겠습니다. 여기서 가져오는 데이터는 4백만 개의 레코드가 있는 직원 데이터입니다. 구현 단계는 다음과 같이 분류됩니다.
  • Setup a New WinForms App with the required packages
  • Create a Custom Data class to Map Fields with the JSON data
  • Bind FlexGrid to JSON Datasource

  • 필수 패키지로 새 WinForms 앱 설정

    Create a new .NET 6 WinForms App using Visual Studio 2022 and add the following packages to the project:

  • C1.Win.FlexGrid
  • C1.Win.Themes
  • C1.AdoNet.Json
  • C1.DataCollection.AdoNet
  • C1.DataCollection.BindingList
  • C1.DataConnector

  • 참고: 여기에서는 FlexGrid의 C1Themes 클래스를 사용하여 MaterialDark 테마를 적용하여 향상된 모양을 제공합니다.

    애플리케이션 설정 방법을 단계별로 보여주는 다음 스크린샷을 참조하세요.

    1 단계



    2 단계



    3단계



    4단계



    5단계



    6단계



    JSON 데이터로 필드를 매핑하기 위한 사용자 정의 데이터 클래스 생성

    Create a new custom data class named Data, implementing the INotifyPropertyChanged , IEditableObject JSON 데이터 소스에서 강력한 형식의 레코드를 가져오기 위해 일반 클래스 C1AdoNetCursorDataCollection에서 사용할 JSON의 스키마에 따른 인터페이스입니다.

        internal class Data : INotifyPropertyChanged, IEditableObject
            {
                // Fields
                private string index;
                private string firstName;
                private string lastName;
                private bool isActive;
                private string salary;
                private string age;
                private string gender;
                private string company;
                private string email;
                private string phone;
                private string address;
    
                [DataMember(Name = "index")]
                public string Index
                {
                    get => index;
                    set
                    {
                        if (index != value)
                        {
                            index = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "firstName")]
                public string FirstName
                {
                    get => firstName;
                    set
                    {
                        if (firstName != value)
                        {
                            firstName = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "lastname")]
                public string Lastname
                {
                    get => lastName;
                    set
                    {
                        if (lastName != value)
                        {
                            lastName = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "salary")]
                public string Salary
                {
                    get => salary;
                    set
                    {
                        if (salary != value)
                        {
                            salary = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "age")]
                public string Age
                {
                    get => age;
                    set
                    {
                        if (age != value)
                        {
                            age = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "gender")]
                public string Gender
                {
                    get => gender;
                    set
                    {
                        if (gender != value)
                        {
                            gender = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "company")]
                public string Company
                {
                    get => company;
                    set
                    {
                        if (company != value)
                        {
                            company = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "email")]
                public string Email
                {
                    get => email;
                    set
                    {
                        if (email != value)
                        {
                            email = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "phone")]
                public string Phone
                {
                    get => phone;
                    set
                    {
                        if (phone != value)
                        {
                            phone = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "address")]
                public string Address
                {
                    get => address;
                    set
                    {
                        if (address != value)
                        {
                            address = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                [DataMember(Name = "isActive")]
                public bool IsActive
                {
                    get => isActive;
                    set
                    {
                        if (isActive != value)
                        {
                            isActive = value;
                            OnPropertyChanged();
                        }
                    }
                }
    
                // INotifyPropertyChanged Members
                public event PropertyChangedEventHandler PropertyChanged;
    
                private void OnPropertyChanged([CallerMemberName] string propertyName = "")
                {
                    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
                }
    
                protected void OnPropertyChanged(PropertyChangedEventArgs e)
                {
                    PropertyChanged?.Invoke(this, e);
    
                }
    
                // IEditableObject Members
                private Data _clone;
    
                public void BeginEdit()
                {
                    _clone = (Data)MemberwiseClone();
                }
    
                public void CancelEdit()
                {
                    if (_clone != null)
                    {
                        foreach (var p in GetType().GetRuntimeProperties())
                        {
                            if (p.CanRead && p.CanWrite)
                            {
                                p.SetValue(this, p.GetValue(_clone, null), null);
                            }
                        }
                    }
                }
                public void EndEdit()
                {
                    _clone = null;
                }
            }
    
    


    FlexGrid를 JSON 데이터 소스에 바인딩

    In the final step, you need to build a connection with your JSON data, as suggested here CursorDataCollection 개체를 C1DataCollectionBindingList에 래핑하여 FlexGrid의 인스턴스에 바인딩합니다.

        C1AdoNetCursorDataCollection<Data> dataCollection;
        string documentConnectionString = $"Data Model=Document;Uri=" + @"..\..\..\4mData.json" + ";Json Path='$.employees';Max Page Size=1000";
        var conn = new C1JsonConnection(documentConnectionString);
        dataCollection = new C1AdoNetCursorDataCollection<Data>(conn, "employees");
        await dataCollection.LoadMoreItemsAsync();
    


    여기에서는 데이터를 로드하기 위해 LoadOnDemand 기능을 사용하고 있으므로 사용자가 마지막으로 보이는 행으로 스크롤하는 즉시 데이터를 비동기적으로 로드하려면 아래에 제공된 대로 FlexGrid의 AfterScroll 이벤트를 처리해야 합니다.

        c1FlexGrid1.AfterScroll += C1FlexGrid1_AfterScroll;
        private void C1FlexGrid1_AfterScroll(object sender, C1.Win.FlexGrid.RangeEventArgs e)
        {
        if (e.NewRange.BottomRow == c1FlexGrid1.Rows.Count - 1)
        {
        _ = dataCollection.LoadMoreItemsAsync();
        }
        }
    


    위 단계를 모두 구현한 후 최종 애플리케이션은 아래 GIF와 같이 작동합니다.



    ADO.NET Provider for JSON을 사용하여 대규모 데이터 응용 프로그램을 만드는 이 데모를 즐기시기 바랍니다. 여기에서 샘플을 다운로드할 수 있습니다.

    이 블로그의 sample을 다운로드하십시오.

    자유롭게 사용해보고 의견 섹션에 의견이나 질문을 남겨주세요. 행복한 코딩!

    좋은 웹페이지 즐겨찾기