2012-09-27 116 views
0

我有一个包含三个表的数据集。我想比较一个表中的列项目与另外两个列项目,但要做到这一点我使用嵌套的foreach循环。代码返回的方式多于应有的数据,所以我有一种感觉我搞砸了;我也确信有一个更好的/更清洁的方式来做到这一点,随时让我知道。多表数据集比较列数据

foreach (DataRow row in dataSet.Tables["Taxonomy"].Rows) 
      { 
       var projectTypes = row["ProjectType"].ToString(); 
       var tier3 = row["Tier3Project"].ToString(); 
       if (tier3.Equals("")) 
        tier3 = "null"; 
       Console.WriteLine(projectTypes); 

       foreach (DataRow dRow in dataSet.Tables["DefaultEventTypes"].Rows) 
       { 
        var name = dRow["name"].ToString(); 
        if (name.Equals("")) 
         name = "null"; 

        /****** Begin Comparisons ******/ 
        if (projectTypes.Trim().ToLower().Equals(name.Trim().ToLower())) 
        { 
         foreach (DataRow sRow in dataSet.Tables["ScheduleEvents"].Rows) 
         { 
          var nameShort = sRow["nameShort"].ToString(); 

          /****** Compare to ScheduleEvent ******/ 
          if (projectTypes.Trim().ToLower().Equals(nameShort.Trim().ToLower())) 
          { 
           //Update both DefaultEventType and ScheduleEvent 
           Console.WriteLine(projectTypes + "  " + name + "  " + tier3); 
           counter++; 
          } 
          else 
          { 

          } 
         } 
        } 
        else 
        { 
         foreach (DataRow sRow in dataSet.Tables["ScheduleEvents"].Rows) 
         { 
          var nameShort = sRow["nameShort"].ToString(); 

          /****** Compare to ScheduleEvent ******/ 
          if (projectTypes.Trim().ToLower().Equals(nameShort.Trim().ToLower())) 
          { 
           //Update ScheduleEvent 
          } 
         } 
        } 
        /****** End Comparisons ******/ 
       } 
      } 

我可以澄清是否需要,谢谢!

编辑:

我想从表“分类”拉一个项目,然后在表“DefaultEventTypes”比较它的每一行。如果有匹配,我就想把'Taxonomy'项目与'ScheduleEvent'中的每一行进行比较。

最后,我想添加更新语句来将匹配项更改为新名称并将表保存回数据库。

它似乎在做比较,但它返回的值的数量太大了。

+0

使用Linq DataTable,它是更清洁和易于比较 - http://msdn.microsoft.com/en-us/library/bb386998.aspx –

回答

2
dataSet.Tables["Table1"].AsEnumerable().Select(r => r.Field<string>("Field1")).Intersect(
dataSet.Tables["Table2"].AsEnumerable().Select(r => r.Field<string>("Field2"))).Intersect(
dataSet.Tables["Table3"].AsEnumerable().Select(r => r.Field<string>("Field3"))); 

类似的东西...没有测试这一点,虽然

PS:这应该回到你的一组值,存在于各个列所有3个表。

回答评论: 那么,你有足够信息来更新你想要的东西。

var valuesThatRepeat = GetWhatYouNeedUsingCodeAbove(); 
foreach (var value in valuesThatRepeat) 
{ 
    var rows = dataSet.Tables["Table2"].AsEnumerable().Where(r => ((string)r["Column2"]).Equals(value));    
    foreach(var row in rows) 
    { 
     row["Column2"] = (string)r["Column2"] + "of_row_with_id_" + (string)r["Id"]; // update the value with whatever you want 
    } 
} 

本示例将更新第二个表中的所有值,以使它们不再与其他两个表中的值相似。 PS:再次,没有测试。语法错误是可能的

+0

这是我的新,我试图它出来,但它似乎只是抓住匹配。我最终希望根据是否匹配来更新数据库。 – Omni

+0

@ negzero7,请看看更新后的帖子 –