我们有两张桌子:
父
ID:整数//主键
名称:字符串
儿童
FK:整数//引用Parent.ID
MoreInfo:String
父级有100,000行,Child有10,000行(父级中很多行未用于子级)
目前我们这样做:
MyDS.Relations.Add("PC", MyDS.Tables["Parent"].Columns["ID"],
MyDS.Tables["Child"].Columns["FK"]);
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
DataRow drParent = drChild.GetParentRows(MyDS.Relations["PC"]).FirstOrDefault();
我们正在考虑改为仅使用Linq手动搜索:
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
DataRow drParent = MyDS.Tables["Parent"].AsEnumerable().FirstOrDefault(
drParent => drParent["ID"] == drChild["FK"]);
表Child仅迭代一次,然后处理数据集。任何人都有使用一种方法或另一种方法的经验 - 如果只使用一次方法,那么在方法1中创建关系会浪费时间吗?
答案 0 :(得分:1)
创建关系绝对不是浪费时间。
每当评估问题的两个潜在解决方案时,您应该始终比较每个选项的成本/时间。从那里你通常可以打电话给哪个选择更好。要记住的一件事是DataRelation的存在是为了优化这些类型的查找。
如果要将DataRelation添加到现有表中,则需要大约125ms来添加关系(创建所需的哈希以通过Datakeys映射父/子行)。
使用仅需要70ms的DataRelation查找10,000个子行中每个子行的每个父行,其中仅使用上面记录的Linq方法需要超过4分钟。
当你考虑它时,这是有意义的,因为第一个将迭代10,000个子行并使用DataRelation的映射Datakeys来查找父行(不需要迭代所有100,000个父项)。但是,第二个解决方案必须遍历每个子行(10,000)并搜索100,000个父行以查找合适的匹配(10,000 x 100,000 = 1,000,000,000)。