dataset1是从sqlserver查询的数据集10w条记录,dataset2是从mysql取的数据集500条记录,现在要筛选10w条数据里和500条相关的,不相关的删掉,以前的做法是2层循环,代码如下:
dsCheck是500条数据结果集,dtTemp是10w条数据结果集。               for (int w = 0; w < dtTemp.Rows.Count; w++)
         {
               boolDel = true;
               for (int z = 0; z < dsCheck.Tables[0].Rows.Count; z++)
                   {
                       object ojF = dsCheck.Tables[0].Rows[z][0];
                                        object ojS = dtTemp.Rows[w][6];                       if (ojF == DBNull.Value)
                       {
                           ojF = -1;
                       }
                       if (ojS == DBNull.Value)
                       {
                           ojS = -1;
                       }
                       if (Convert.ToInt64(ojF) == Convert.ToInt64(ojS))
                       {
                           boolDel = false;
                           break;
                       }
                   }
                   if (boolDel == true)
                       dtTemp.Rows[w].Delete();
               }
               dtTemp.AcceptChanges();
方法很慢,后来考虑用dataset里边的select方法,但调了半天也没调明白,可否有人能帮忙给点提示,或就着这段代码给点修改,谢谢!

解决方案 »

  1.   

    select方法里面写你的筛选条件就行了,或者你用Linq去实现吧
      

  2.   


    select方法返回一个datarow,这个数组我没用过也不太懂,至于Linq是啥就更没听说过了。如果修改算法,我代码应该怎么变动?望指点一二。
      

  3.   

    string sel = "";
    DataRow[] rows = dsCheck.Select("列名");
    foreach(DataRow row in rows)
    {
       sel += "'" + row + "',";
    }
    sel = sel.Substring(0, sel.Length - 1);
    DataRow[] dataRow=dtTemp.table[0].select("列名 in ("+sel+")");
    foreach(DataRow row in dataRow)
    {
        dtTemp.remove(row);
    }
      

  4.   

    以下文章可参考下,你两个表应该要双循环了
    文章只简单介绍,你可自己整理有用的代码
    http://www.chinaret.com/user/topic_view.aspx?u=tianruoyouqing&id=7c956666-3762-480a-bc80-ed08d6ff1e24
      

  5.   

    DataTable.Select("UserName='admin'");
    具体参考MSDNhttp://msdn.microsoft.com/zh-cn/library/system.data.datatable.select(v=vs.80).aspx
      

  6.   


    代码我大概看明白了怎么循环筛选,可拷带代码里有3个地方调不通,
    1、dsCheck.Select("列名");这个地方,我列名应该怎么填?
    2、dtTemp.table[0].sel;这个地方,我dtTemp结果集点不出来table【0】
    3、dtTemp.remove(row);这个地方也点不出来remove方法。
      

  7.   

    string sel = "";
    foreach(DataRow row in dsCheck.Table[0].Rows)
    {
    sel += "'" + row[0] + "',";
    }
    sel = sel.Substring(0, sel.Length - 1);
    DataRow[] dataRow=dtTemp.table[0].select("列名 in ("+sel+")");
    foreach(DataRow row in dataRow)
    {
      dtTemp.Rows.remove(row);
    }
    1.在查询数据库时如:select row1,row2 from tabel
    其中的列名就是row1或者row2,你这里对应的是dtTemp.Columns[6]这列,不好意思刚才有点错误
      

  8.   

    dtTemp如果是dataSet就有table,如果是DataTable就直接dtTemp.select("列名 in ("+sel+")");
      

  9.   


    我不会C#,而且把这个项目框架搭好的同事被外派出去了,我只是用土办法给功能实现,不会效率了优化了,所以一碰到问题,就抓瞎,方法倒是通过各种资料想到了些,但是一到代码实现就不能调通,各种报错啊。
    其实我最初的想法是外层10w数据的结果集做循环,进去的数据,在500条数据的结果集去查找,是否存在,返回一个bool值,如果没有就把这条记录移除。但总没有找到合适的写法。
      

  10.   

    按照你写的代码,dtTemp应该是DataTable,用dtTemp.select("列名 in ("+sel+")");应该没问题
      

  11.   


    嗯,我刚才吃完饭回来调了下,代码没编译错误了。但是纠结的事又出来了。异常出来了。就是这句话,看来还是我的select里边有问题。我把我那个代码再给你看眼。你看看怎么改。
    string sel = "";
                   foreach (DataRow row in dsCheck.Tables[0].Rows)
                   {
                       sel += "'" + row[0] + "',";
                   }
                   sel = sel.Substring(0, sel.Length - 1);
    -------------------------------------------------------------------
                   DataRow[] dataRow = dtTemp.Select(Convert.ToString(dtTemp.Rows[6]) + "in (" + sel + ")");这段报错,式に定義されていない関数呼び出し System.Data.DataRowin() が含まれています。我的dsCheck查出来的是o ,dtTemp里边7个字段效果如下:
    字段名:1  2  3  4  5  6  7
    内  容:a  b  c  d  e  f  g
           j  k  m  l  n  o  p
           s  t  u  v  x  y  z
    -------------------------------------------------------------------
                   foreach (DataRow row in dataRow)
                   {
                       dtTemp.Rows.Remove(row);
                   }
      

  12.   

    我调明白了,我把select(6 not in (sel))就好了。不能用in,我是要把不符合的剔除,用in的话把符合条件的都删掉了。留下的是我不需要的数据。分就给你好了。