2010-04-23 4 views
1

우리의 응용 프로그램에서는 동적으로 생성 된 클래스를 사용하여 많은 데이터를 보유 할 것을 고려하고 있습니다. 이렇게하는 이유는 테이블 구조가 다른 고객이 있기 때문입니다. 따라서 고객은 "DOG", "DOGNAME", "DOGTYPE"등의 열을 포함하는 "DOG"라는 고객 테이블을 가질 수 있습니다. 고객 # 2는 " DOGID ","DOG_FIRST_NAME ","DOG_LAST_NAME ","DOG_BREED "등이 있습니다. 고객이 언제든지 테이블 스키마를 변경할 수 있으므로 컴파일 타임에 이러한 클래스를 생성 할 수 없습니다.C#/.NET 4.0에서 동적 클래스 채우기 및 사용

현재 리플렉션을 사용하여 런타임에 "DOG"클래스를 생성 할 수있는 코드가 있습니다. 알아 내려고하는 것은 극한의 성능 저하없이 DataTable (또는 다른 .NET 메커니즘)에서이 클래스를 채우는 방법입니다. ~ 20 열과 ~ 50k 행을 포함하는 하나의 테이블이 있습니다. 컬렉션을 생성하기 위해 모든 행과 열에 대해 foreach를 수행하면 약 1 분이 소요됩니다. 이는 너무 길어집니다.

너무 복잡하거나 올바르게 진행되는 해결책을 찾고 있습니까? 다른 사람이 이런 문제를 겪었습니까? 동적 클래스 생성은 Microsoft의 개발자가 제안한 솔루션입니다. 이 컬렉션을 채우고 효율적으로 사용할 수 있다면 효과가 있다고 생각합니다.

+0

메모를 작성하기 만하면 고객이 즉시 테이블 스키마를 볼 수 있으므로 ORM이 작동하지 않습니다.고객이 데이터베이스를 변경할 때마다 응용 프로그램을 다시 컴파일하고 다시 게시 할 수 없습니다. 그러나 많은 양의 데이터가있는 경우 너무 느리기 때문에 DataTable에 의존 할 수 없습니다. –

답변

1

정확하게 시간이 필요한 부분을 파악한 다음이를 최적화하려면 프로파일 러를 사용해야합니다. 데이터를 설정할 때 리플렉션을 사용하면 속도가 느려집니다. 반사 된 유형 데이터를 캐싱하여 많은 것을 저장할 수 있습니다.

내가 궁금한데, 멤버가 컴파일 타임에 알려지지 않은 경우이 클래스를 어떻게 사용하겠습니까? 아마도이 시나리오에서 일반 DataTable을 사용하는 것이 더 나을 것입니까?

+0

DataTable의 처리 속도가 너무 느립니다. 우리는 현재 구현을 위해 DataTable을 사용하고 있습니다. –

3

당신이하려는 일은 .NET 3.5에서 상당히 불만을 토로합니다. 모델의 데이터에 대한 키/값 쌍이 사전 <> 유형으로 작성하는 것이 좋습니다.

.NET 4.0을 사용할 수 있다면 using dynamic and ExpandoObject을 볼 수 있습니다. dynamic 키워드를 사용하면 진정한 동적 객체에 대한 참조를 만들 수 있습니다. ExpandoObject을 사용하면 속성 및 메서드를 즉시 추가 할 수 있습니다. 복잡한 리플렉션이나 코드 겐 로직없이 동적 유형의 이점은 DLR이 런타임 바인딩 정보의 정교한 캐싱을 수행하여 유형이 일반 반영에서 허용하는 것보다 더 성능이 좋도록 허용하는 것입니다.

데이터를 기존 유형에로드하는 것이 필요한 경우 유형에 ORM 동작을 제공하려면 EntityFramework 또는 NHibernate과 같은 것을 사용하는 것이 좋습니다.

데이터로드 성능을 처리하기 위해 DataTable을 우회하여 생성하는 유형으로 레코드를 직접로드하는 것이 좋습니다. 필자는 대부분의 성능 문제가 원래 있던 DataTable의 값을 읽고 캐스팅하는 것으로 의심됩니다.

+0

ORM을 사용하는 것이 좋지만 테이블이 예고없이 변경 될 수 있으므로 ORM이 작동하지 않습니다. .NET 4.0의 동적 기능을 살펴 보았지만 컴파일 타임에 속성 이름을 알 수 없기 때문에 동적 기능이 작동하지 않는 것 같습니다. 내가 틀렸다면 나를 교정 해주세요. 사전을 사용하는 솔루션에 대해서도 작업하고 있지만 시도 할 때까지 작동하는지 확실하지 않습니다. 우리가 생성하는 유형에 데이터를로드하는 방법에 문제가 있습니다. 그렇게 할 수있는 빠른 방법이 있습니까? –

+0

@Bob : 따라서 데이터베이스의 임의의 데이터를 동적 코드 생성 클래스로 매핑 할 수 있어야합니다. 흠. 실제 동적 언어 (Ruby 또는 Python과 같은)를 사용할 수있는 경우 동적 유형이 자체적으로 도움이되지 않을 수 있습니다. DataTable에서 사용자 정의 유형으로 매핑 함수를 생성하기 위해 일부 메타 프로그래밍을 할 수 있습니다. 그렇습니다. 이미 엔티티 클래스를 동적으로 생성하는 코드가있는 것 같습니다. DataTable 대신 DataReader를 직접 사용하여 채웠습니까? 효율적인로드를 지원하기 위해 사용자의 유형에 Load (DbDataReader) 메소드를 생성하는 데 도움이 될 수 있습니다. – LBushkin

+0

귀하의 가정은 모두 정확합니다. 필자는 IronPython을 사용하여이 부분에 대해 생각해 보았지만 아직 그 지점을 아직 알지 못했습니다. 필자가 작성한 샘플 응용 프로그램에서 DataReader를 사용하여 테스트 해 보았습니다. 성능이 조금 향상되었지만 데이터가 모두 검색되면 실제 응용 프로그램에서 사용할 수는 없을 것입니다. 서비스를 통해. 클라이언트 응용 프로그램은 데이터베이스에 직접 액세스 할 수 없습니다. WCF를 통해 동적 객체를 전달해야합니다. : -O –

1

PicoPoco 및 Massive를 확인하십시오. 이들은 마이크로 ORMS입니다. (경량의 오픈 소스 ORM 프레임 워크)를 사용하면 단일 코드 파일을 프로젝트에 간단하게 복사 할 수 있습니다.

Massive는 ExpandoObject를 사용하고 IDataRecord에서 ExpandoObject 로의 변환을 수행합니다.

PicoPoco는 기존의 일반 클래스를 가져 와서 데이터베이스에서로드하기 위해 동적으로 효율적으로 메소드를 생성합니다.

관련 문제