私は自分のシナリオをできる限り最善の方法で説明しようとします。データベースに次のテーブルがあります。
Products{ProductId, CategoryId ...}
Categories{CategoryId ...}
CategoryProperties{CategoryPropertyId, CategoryId, Name ...}
PropertyValues{ProductId, CategoryPropertyId, Value ...}
したがって、目標は、あるカテゴリに属する製品のリストを作成することであり、各カテゴリには、「PropertyValues」テーブルの値を持つ「n」個のプロパティを含めることができます。'categoryId'に基づいてデータを返すクエリがあるので、データベースから常に異なる結果を取得できます。
CPUカテゴリの場合:
intel i7 | CPU | Model | Socket | L1 Cash | L2 Cahs | etc.
HDDカテゴリの場合:
samsung F3 | HDD | Model | Speed | GB | etc.
そのため、結果としてクエリのカテゴリに基づいて、常に異なる列番号と名前を取得できます。データベースアクセスには、結果を返すストアドプロシージャへの単純なADO.NET呼び出しを使用します。しかし、クエリ結果は本質的に動的であるため、このデータを読み取るための適切な方法がわかりません。
私はProduct
エンティティを作成しましたが、実際に作成する方法がわかりません:(エンティティを作成し、、、、、、、などを継承する他のProduct
エンティティを作成
できると思いましたが、これを終了できるので愚かだと思いますドメイン内の
200以上のエンティティ。
この状況で何をしますか?この動的プロパティの
読み方と配置場所?
更新-いくつかの解決策@millimooseの提案と@TimSchmelterのアイデアに
基づいています Product
Cpu
Hdd
Camera
PcCase
GraphicCard
MobilePhone
Gps
Dictionary
DataTable
オブジェクト私はいくつかの解決策に到達しました。
さて...これはうまくいきます。データを読み取って表示することができます。
しかし、私はまだ私よりも賢い人々からのアドバイスが必要です。私はこれをうまくやったのか、これをうまく処理するべきなのか、それともスパゲッティコードを作ったのか。だからここで私がしたこと:
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);
}
}