.NET 앱의 JSON 데이터 소스에서 수백만 개의 행을 로드하는 방법
일반적으로 JSON에 엄청난 수의 레코드가 있는 경우(예: 수백만 개) 데이터를 반복하여 할당하는 데 시간이 오래 걸리지만 JSON DataConnector를 사용하면 몇 번에 데이터만큼 로드할 수 있습니다. 초이며 현재 이 기능은 Top level Document Model을 통해서만 사용할 수 있습니다.
이 블로그에서는 ADO.NET Provider for JSON을 사용하여 수백만 개의 레코드를 FlexGrid에 매우 빠르게 로드하는 방법을 알아보겠습니다. 여기서 가져오는 데이터는 4백만 개의 레코드가 있는 직원 데이터입니다. 구현 단계는 다음과 같이 분류됩니다.
필수 패키지로 새 WinForms 앱 설정
Create a new .NET 6 WinForms App using Visual Studio 2022 and add the following packages to the project:
참고: 여기에서는 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을 다운로드하십시오.
자유롭게 사용해보고 의견 섹션에 의견이나 질문을 남겨주세요. 행복한 코딩!
Reference
이 문제에 관하여(.NET 앱의 JSON 데이터 소스에서 수백만 개의 행을 로드하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/grapecity/how-to-load-millions-of-rows-from-json-data-sources-in-your-net-app-46a6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)