Я попытаюсь объяснить свой сценарий наилучшим образом. В моей базе данных есть следующие таблицы:
Products{ProductId, CategoryId ...}
Categories{CategoryId ...}
CategoryProperties{CategoryPropertyId, CategoryId, Name ...}
PropertyValues{ProductId, CategoryPropertyId, Value ...}
Таким образом, цель состоит в том, чтобы иметь список продуктов, принадлежащих какой-либо категории, и каждая категория может иметь "n" количество свойств со значениями в таблице "PropertyValues". У меня есть запрос, который возвращает данные на основе "categoryId", поэтому я всегда могу получить разные результаты из базы данных:
Для категории CPU:
intel i7 | CPU | Model | Socket | L1 Cash | L2 Cahs | etc.
Для категории HDD:
samsung F3 | HDD | Model | Speed | GB | etc.
Поэтому, основываясь на категориях из моего запроса, я всегда могу получить разные номера столбцов и имена. Для доступа к базе данных я использую простой вызов ADO.NET для хранимой процедуры, возвращающей результат. Но поскольку результат запроса динамичен в природе, я не знаю, что это хороший способ прочитать эти данные.
Я создал объект Product
, но Я запутался, как это сделать: (
Я думал, что могу создать объект Product
и сделать другие объекты, которые наследуют Product
, как Cpu
, Hdd
, Camera
, PcCase
, GraphicCard
, MobilePhone
, Gps
и т.д.
но я думаю, что , что это глупо, потому что я могу закончить это с 200 + сущностями в домене.
Что бы вы сделали в этой ситуации?
Как читать и где размещать эти динамические свойства ?
UPDATE - некоторое решение
Все в порядке на основе предложения @millimoose для Dictionary
и идеи @Tim Schmelter для использования объекта DataTable
. Я пришел к определенному решению.
Теперь... это работает, я получаю данные, читаю их, и я могу их отобразить.
Но мне все еще нужен совет от более умных людей, чем я, на , я сделал это хорошо, или я должен справиться с этим лучше, или я сделал несколько spageti code.
Итак, вот что я сделал:
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);
}
}