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方法,但调了半天也没调明白,可否有人能帮忙给点提示,或就着这段代码给点修改,谢谢!
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方法,但调了半天也没调明白,可否有人能帮忙给点提示,或就着这段代码给点修改,谢谢!
select方法返回一个datarow,这个数组我没用过也不太懂,至于Linq是啥就更没听说过了。如果修改算法,我代码应该怎么变动?望指点一二。
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);
}
文章只简单介绍,你可自己整理有用的代码
http://www.chinaret.com/user/topic_view.aspx?u=tianruoyouqing&id=7c956666-3762-480a-bc80-ed08d6ff1e24
具体参考MSDNhttp://msdn.microsoft.com/zh-cn/library/system.data.datatable.select(v=vs.80).aspx
代码我大概看明白了怎么循环筛选,可拷带代码里有3个地方调不通,
1、dsCheck.Select("列名");这个地方,我列名应该怎么填?
2、dtTemp.table[0].sel;这个地方,我dtTemp结果集点不出来table【0】
3、dtTemp.remove(row);这个地方也点不出来remove方法。
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]这列,不好意思刚才有点错误
我不会C#,而且把这个项目框架搭好的同事被外派出去了,我只是用土办法给功能实现,不会效率了优化了,所以一碰到问题,就抓瞎,方法倒是通过各种资料想到了些,但是一到代码实现就不能调通,各种报错啊。
其实我最初的想法是外层10w数据的结果集做循环,进去的数据,在500条数据的结果集去查找,是否存在,返回一个bool值,如果没有就把这条记录移除。但总没有找到合适的写法。
嗯,我刚才吃完饭回来调了下,代码没编译错误了。但是纠结的事又出来了。异常出来了。就是这句话,看来还是我的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);
}