我正在用 WPF 编写一个应用程序。我正在使用 Entity Framework 5,想知道您是否可以就如何处理以下情况给我建议。
我基本上只有三个表:
项目 {ID,名称}
属性 {ID、名称、类型}
AttributeValue {ItemID, AttributeID, 值}
我们的客户想要为他的物品添加属性,这似乎工作得很好。现在他可以添加属性并为他的项目分配值。第一个问题:你认为这是好的设计吗?
现在的问题是如何在 WPF DataGrid 中显示项目并将所有属性显示为列。这就是我们现在所拥有的:
我们以编程方式生成列:
foreach (var attribute in db.Attributes)
{
datagrid.Columns.Add(new DataGridTextColumn
{
Header = attribute.Name,
Binding = new Binding { Path = new PropertyPath(string.Format("[{0}]", attribute.ID)) }
});
}
这工作正常。现在的问题是如何在 Items-Class 中实现索引器。我们有一个选项在处理大量数据时会变得非常慢(20.000 个项目,400 个属性,每个项目都有 100 个值):
public AttributeValue this[int i]
{
get
{
return AttributeValues.FirstOrDefault(aa => aa.AttributID == i);
}
}
就像我说的,这行得通,但它会变慢。而不是总是查询属性值,我想在显示之前缓存所有内容:
var items = db.Items.AsNoTracking().ToArray();
CachedValues.Values = new Dictionary<int, Dictionary<int, AttributeValue>>(items.Length);
foreach (var item in items)
{
var attributevalues = db.AttributeValue.AsNoTracking().Where(w => w.ArtikelID == item.ID).ToArray();
CachedValues.Values[item.ID] = new Dictionary<int, AttributeValue>(attributevalues.Length);
foreach (var value in attributevalues)
{
CachedValues.Values[item.ID][value.AttributeID] = value;
}
}
我使用静态类作为缓存:
public static class CachedValues
{
public static Dictionary<int, Dictionary<int, ArtikelAttribut>> Values;
}
然后在 Items-Class 中,我可以访问缓存:
public AttributeValue this[int i]
{
get
{
AttributeValue val = null;
CachedValues.Values[ID].TryGetValue(i, out val);
return val;
}
}
显然,初始化缓存需要一些时间(15 秒),但速度要快得多。按数据网格中的属性对项目进行排序只需一秒钟。使用另一种方法需要很长时间。
我对解决方案不满意,您有什么建议吗?我会欣赏任何形式的批评(我知道两者都不是好的解决方案)。
谢谢,
托马斯
编辑
为了让第一个问题更清楚,一个小例子:
项目:Item1,Item2,Item3,... 属性:宽度,高度,速度,... AttributeValues:(Item1,宽度,100),(Item1,Height,200),(Item2,Width,100),(Item3 , 身高, 200), (Item3,Speed,40)
所以这是一个经典的多对多关系。一个属性可能出现在 0-many Items 中,并且 Item 可能有 0-many 属性。