我会尽力以最好的方式解释我的情况。我在我的数据库中有以下表:
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调用存储过程返回结果。但是由于查询结果具有动态性质,我不知道读取这些数据的好方法。
我创建了一个“产品”实体,但我很困惑如何真正制作它。我认为可以创建一个“产品”实体,并创建其他实体,这些实体继承“产品”,例如CPU、硬盘、相机、PC机箱、显卡、手机、GPS等。但我认为这很愚蠢,因为我可能会在域中获得200多个实体。
在这种情况下,您会怎么做?如何读取并存储这些动态属性?
更新-一些解决方案
好吧,基于@millimoose的建议使用字典和@Tim Schmelter使用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);
}
}
Product
拥有一个单一的Dictionary<string, object>
(或类似的东西)呢? - millimooseDataTables
。然后您只需要一个 SQL 查询和一个SqlDataAdapter
来填充表格。 - Tim SchmelterDictionary
。但我想知道在这种情况下是否有其他不同的解决方案。或者Dictionary
实际上是唯一或最好的解决方案。 - 1110Dictionary
,这似乎是显而易见的选择。如果在设计中遇到问题,请回来询问相关问题。 - millimoose