2013-03-04 13 views
6

私ができる最良の方法を私のシナリオについて説明しようとします。私は自分のデータベースに次のテーブルを持っている:データベースから動的プロパティを読み取る方法

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

ので、目標は、いくつかのカテゴリに属し、各カテゴリは「PropertyValues」テーブル内の値を持つプロパティの「n」の番号を持つことができる製品のリストを持っていることです。 HDDのカテゴリについては

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

samsung F3 | HDD | Model | Speed | GB | etc. 
CPUカテゴリで

:私はので、私はいつも、データベースから異なる結果を得ることができる「区分」に基づいてデータを返すクエリを持っています

結果として私のクエリのカテゴリに基づいて、私は常に異なる列番号と名前を得ることができます。データベースアクセスの場合は、結果を返すストアドプロシージャへの単純なADO.NET呼び出しを使用します。 しかし、クエリの結果は本質的に動的なので、私はこのデータを読む良い方法は何か分かりません。

私は、Productエンティティをしたが、、私はそれが本当に:( 私はProductエンティティを作成し、他のエンティティ継承ProductPcCaseCameraHddCpuなどを作ることができると考え作る方法を混乱していますGraphicCardMobilePhoneGpsなど

が、私は200以上のエンティティドメイン内でこれを終了することができますので、それは愚かだとを考える。

あなたはこの状況で何をしますか?
これを読む方法と置く場所力学的性質

UPDATE - いくつかのソリューション

に基づくすべての権利は、私はいくつかの解決策に来DataTableオブジェクトを使用するDictionary@Tim Schmelterアイデアのため提案を@millimoose。
これは動作しますが、データを読み取って表示できます。
でも、私よりもスマートな人たちから助言が必要です私はこの良いことをしましたか、これをより良く扱うべきか、私はいくつか作られましたスパゲティコード。だからここに私がやったこと :

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="Speed", Value="150MB/s"}); 
+0

私はこれのようにそれを処理することはできません。 'Properties'プロパティは動的でなければならないので、私はプロパティの名前を知らないので、それを読むことができません。 – 1110

+0

「動的」なので、アップデートごとに –

+0

のものが返ってくるだけで、各ProductPropertyに値が設定されます –

0

元のアプローチ

はかなり良いです。私はカスタムのコレクションを使用しますが、意図が明確になるように名前を付けてください。


また、C#4.0のdynamic機能クールもっと利用することができるが、私はそれがあなたのケースになりますメリットはよく分かりません。単一 `辞書を持っているだけで、` Product`を持つのではなく、あなたがあなたのモデルクラスで使用可能な性質を持っている必要があります何らかの理由があるHow to convert a data reader to dynamic query results

関連する問題