2013-03-04 2 views
6

가능한 최선의 방법을 설명하려고합니다. 내 데이터베이스에 다음과 같은 테이블이 있습니다 데이터베이스에서 동적 속성을 읽는 방법

Products{ProductId, CategoryId ...} 
Categories{CategoryId ...} 
CategoryProperties{CategoryPropertyId, CategoryId, Name ...} 
PropertyValues{ProductId, CategoryPropertyId, Value ...} 

그래서 목표는 어떤 범주에 속하고 각 카테고리는 'PropertyValues'테이블에서 값 속성의 'N'을 가질 수있는 제품의 목록을 가지고하는 것입니다. 는 CPU 범주의

: 하드 디스크 범주의

intel i7 | CPU | Model | Socket | L1 Cash | L2 Cahs | etc. 

:

samsung F3 | HDD | Model | Speed | GB | etc. 
그래서 난 항상 데이터베이스에서 다른 결과를 얻을 수있는 '카테고리 ID'를 기반으로 데이터를 반환하는 쿼리를

그래서 내 쿼리의 카테고리를 기반으로해서 항상 다른 열 번호와 이름을 얻을 수 있습니다. 데이터베이스 액세스의 경우 결과를 반환하는 저장 프로 시저에 대한 간단한 ADO.NET 호출을 사용합니다. 그러나 쿼리 결과가 자연 스럽기 때문에이 데이터를 읽는 좋은 방법이 무엇인지 알지 못합니다.

가 나는 Product 엔티티하지만 내가 정말 :( 나는 내가 Product 엔티티를하고있는 상속 다른 엔티티를 만들 수 있다고 생각하는 방법을 혼란 스러워요했다ProductCpu 같은 Hdd, Camera, PcCase, GraphicCard, MobilePhone, Gps

하지만 난 생각 내가 200 개 이상의 기관 도메인의 이것을 끝낼 수 있기 때문에 바보있다.

이 상황에서 무엇을 하시겠습니까?
읽는 방법 및 넣을 곳 동적 속성?

UPDATE - 일부 솔루션

에 따라 모든 권리는 좀 솔루션에 온 DataTable 개체를 사용 Dictionary@ 팀 Schmelter 아이디어 제안을 @millimoose.
이제 ...이 작업은 데이터를 읽음으로써 표시 할 수 있습니다.
그러나 나는 여전히 에 대해 나보다 똑똑한 사람들로부터 조언을 필요로한다. 나는이 좋은 것을했다. 또는 나는 이것을 잘 처리해야한다. 또는 나는 약간을 만들었다. spageti 코드. 그래서 여기에 내가 무슨 짓을했는지 :

public class Product 
    { 
     public Product() 
     { 
      this.DynamicProperties = new List<Dictionary<string, string>>(); 
     } 

     public List<Dictionary<string, string>> DynamicProperties { get; set; } 

    } 
... 
List<Product> products = new List<Product>(); 
... 
using (SqlDataAdapter a = new SqlDataAdapter(cmd)) 
       { 
        DataTable t = new DataTable(); 
        a.Fill(t); 

        Product p = null; 

        foreach (DataRow row in t.Rows) 
        { 
         p = new Product(); 
         foreach (DataColumn col in t.Columns) 
         { 
          string property = col.ColumnName.ToString(); 
          string propertyValue = row[col.ColumnName].ToString(); 

          Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

          dictionary.Add(property, propertyValue); 

          p.DynamicProperties.Add(dictionary); 
         } 

         products.Add(p); 
        } 
       } 
+1

: 당신은

public class Product { public List<dynamic> DynamicProperties { get; set; } } ... conn.Open(); using (var reader = cmd.ExecuteReader()) { var p = new Products(); p.DynamicProperties = reader.AsDyamic().ToList(); //or foreach (var item in reader.AsDynamic()) yield return item; } // carry this extension method around public static IEnumerable<dynamic> AsDynamic(this IDataReader reader) { var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList(); foreach (IDataRecord record in reader as IEnumerable) { var expando = new ExpandoObject() as IDictionary<string, object>; foreach (var name in names) expando[name] = record[name]; yield return expando; } } 

다소 관련 질문을 같은 뭔가를 할 수 '(또는 이와 비슷한 것)? – millimoose

+0

가장 쉬운 방법은'DataTables'를 이용하는 것입니다. 그런 다음 SQL 쿼리와 'SqlDataAdapter' 테이블을 채우기 만하면됩니다. –

+0

@millimoose 처음에는'Dictionary'에 대해 생각했습니다. 그러나 나는이 시나리오에 대해 다른 해결책이 있는지 알지 못한다. 또는 '사전'은 실제로 유일한 해결책입니다. – 1110

답변

1

당신은 제품 범주의 무리가 있고, 각 카테고리는 속성의 무리가 있습니다.

class Product 
{ 
    public int Id { get; set; } 
    public Category Category { get; set; } 
    public List<ProductProperty> Properties { get; set; } 
} 

class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class ProductProperty 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

방금 ​​제품에 속성을 추가 한 다음 목록/사전

에서 제품의 특성을 저장할 수

Properties.Add(new ProductionProperty() { Name="intel i7"}); 

경우 또는

이름/값

Properties.Add(new ProductionProperty() { Name="Speed", Value="150MB/s"}); 
+0

이렇게 처리 할 수 ​​없습니다. 'Properties' 속성은 동적이어야하므로 속성 이름을 모르므로 읽을 수 없습니다. – 1110

+0

"동적"인 경우 각 ProductProperty에 업데이트 당 –

+0

이 돌아올 때마다 채워집니다. –

0

원래 방식

은 아주 좋습니다. 나는 더 나은 명명법을 사용하여 사용자 정의 컬렉션을 사용하므로 의도가 명확합니다.


또한 C# 4.0의 dynamic 기능 멋진을 더 활용할 수 있지만, 나는 귀하의 경우 제공 혜택을 모르겠어요. 하나의`사전이 단지`Product`을하는 대신, 당신은 당신의 모델 클래스에서 사용할 수있는 특성을 가지고해야하는 이유가 How to convert a data reader to dynamic query results

관련 문제