DataSet Relations或linq搜索更好的性能?

时间:2010-11-21 17:50:13

标签: c# linq dataset

我们有两张桌子:

  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中创建关系会浪费时间吗?

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)。