Datatable的Select方法简介


DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的重载,分别是

Select()

Select(stringfilterExpression)

Select(stringfilterExpression,stringsort)

Select(stringfilterExpression,stringsort,DataViewRowStaterecord States)。

1)Select()——获取所有System.Data.DataRow对象的数组。

2)Select(stringfilterExpression)——按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有System.Data.DataRow对象的数组。

3)Select(stringfilterExpression,stringsort)——获取按照指定的排序顺序且与筛选条件相匹配的所有System.Data.DataRow对象的数组。

4)Select(stringfilterExpression,stringsort,DataViewRowStaterecordStates)——获取与排序顺序中的筛选器以及指定的状态相匹配的所有System.Data.DataRow对象的数组。

下面是对这些方法进行演示的示例:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

namespaceTestDataTableSelect

{

classProgram

{

staticDataTabledt =newDataTable();

staticvoidMain(string[] args)

{

DataColumndc1 =newDataColumn("id");

dc1.DataType=typeof(int);

DataColumndc2 =newDataColumn("name");

dc2.DataType=typeof(System.String);

dt.Columns.Add(dc1);

dt.Columns.Add(dc2);

for(inti = 1; i <=10;i++ )

{

DataRowdr = dt.NewRow();

if(i <= 5)

{

dr[0] = i;

dr[1] = i +"--"+"hello";

}

else

{

dr[0] = i;

dr[1] = i +"--"+"nihao";

}

dt.Rows.Add(dr);

}

Select();

Select("id>='3' and name='3--hello'");//支持and

Select("id>='3' or id='1'");//支持or

Select("name like '%hello%'");//支持like

Select("id>5","id desc");

Select("id>5", "id desc",DataViewRowState.Added);

}

privatestaticvoidSelect()

{

DataRow[] arrayDR = dt.Select();

foreach(DataRowdrinarrayDR)

{

Console.WriteLine(dr[0].ToString()+""+dr[1].ToString());

}

Console.ReadLine();

}

privatestaticvoidSelect(stringfilterExpression)

{

DataRow[] arrayDR = dt.Select(filterExpression);

foreach(DataRowdrinarrayDR)

{

Console.WriteLine(dr[0].ToString() +""+ dr[1].ToString());

}

Console.ReadLine();

}

privatestaticvoidSelect(stringfilterExpression,stringsort)

{

DataRow[] arrayDR = dt.Select(filterExpression,sort);

foreach(DataRowdrinarrayDR)

{

Console.WriteLine(dr[0].ToString() +""+ dr[1].ToString());

}

Console.ReadLine();

}

privatestaticvoidSelect(stringfilterExpression,stringsort,DataViewRowStaterecordStates)

{

DataRow[] arrayDR = dt.Select(filterExpression, sort,recordStates);

foreach(DataRowdrinarrayDR)

{

Console.WriteLine(dr[0].ToString() +""+ dr[1].ToString());

}

Console.ReadLine();

}

}

}

注意事项:上面的Select操作是大小写不敏感的(记录的字段不敏感),如果需要区分大小写,需要将DataTable的caseSensitive属性设为true。

当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到:

1DataTabledt=newDataTable();//假设dt是由"SELECTC1,C2,C3FROMT1"查询出来的结果
2for(inti=0;i<dt.Rows.Count;i++)
3{
4if(dt.Rows[i]["C1"].ToString()=="abc")//查询条件
5{
6//进行操作
7}
8}

但这种做法用一两次还好说,用多了就累了。那有没有更好的方法呢?记得LinQ是可以直接对DataTable进行查询操作的,那在.Net Framework 2.0里,有没有类似的方法呢?答案是肯定的,就是dt.Select(),上面的操作可以改成这样:

1DataRow[]drArr=dt.Select("C1='abc'");//查询

还可以这样操作:

1DataRow[]drArr=dt.Select("C1LIKE'abc%'");//模糊查询
2DataRow[]drArr=dt.Select("'abc'LIKEC1+'%'","C2DESC");//另一种模糊查询的方法
3DataRow[]drArr=dt.Select("C1='abc'","C2DESC");//排序

问题又来了,如果要把DataRow赋值给新的DataTable,怎么赋值呢?你可能会想到:

1DataTabledtNew=dt.Clone();
2for(inti=0;i<drArr.Length;i++)
3{
4dtNew.Rows.Add(drArr[i]);
5}

但这样程序就会出错,说该DataRow是属于其他DataTable的,那要怎么做呢?很简单,这样就可以解决了:

1DataTabledtNew=dt.Clone();
2for(inti=0;i<drArr.Length;i++)
3{
4dtNew.ImportRow(drArr[i]);
5}

这样就完成了

优质内容筛选与推荐>>
1、MessageBox ShowNumber 之类的迷案
2、Jboss部署文档
3、C#与.Net的关系
4、C++ 四种显示转换
5、使用脚本启动fabric时出错


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn