标签:必须 alt system new rom com datatable 严格 tar
查询单个数据表
根据Linq to DataSet概述的步骤,
第一步我们获取数据源,我们这里手动创建一个datatable数据源
static DataSet BuildOneDTDataSet() {
string[] nameset = { "张三", "李思思", "lisi", "王五", "路六", "欧赔", "夏琪","王二麻子" };
string[] xbSet = { "男", "女", "男", "女", "男", "女", "男", "女" };
int[] ageSet = { 12, 45, 23, 45, 78, 56, 12, 22 };
DataSet ds = new DataSet("PeopleDs");//创建名为"PeopleDs"的dataset对象
DataTable dt = new DataTable("PeopleDt");//创建名为PeopleDt的datatable对象
ds.Tables.Add(dt);
dt.Columns.AddRange(
new DataColumn[]{
new DataColumn("Name",Type.GetType("System.String")),
new DataColumn("XingBie",Type.GetType("System.String")),
new DataColumn("Age",Type.GetType("System.Int32"))
}
);
for (int i = 0; i < nameset.Length; i++) //将数据写进一张datatable表
{
DataRow row = dt.NewRow();
row["Name"] = nameset[i];
row["Age"] = ageSet[i];
row["XingBie"] = xbSet[i];
dt.Rows.Add(row);
}
return ds;
}
第二步,将datatable转换成IEnumberable<T>类型,使用AsEnumerable(),结合linq语法进行查询
static void UseSelect() {
DataSet ds = BuildOneDTDataSet();
DataTable dt = ds.Tables["PeopleDT"];//从数据集中获取名为PeopleDt的数据表
var query = from pl in dt.AsEnumerable() select pl;
foreach (var item in query)
{
Console.WriteLine("姓名{0},年龄{1},性别{2}", item.Field<string>("Name"), item.Field<int>("Age"), item.Field<string>("XingBie"));
}
var query1 = from pl in dt.AsEnumerable() select pl.Field<string>("Name");
foreach (var item in query1)
{
Console.WriteLine(item);
}
//查询所有年龄大于22岁的记录
var query2 = from pl in dt.AsEnumerable()
where pl.Field<int>("Age") > 22
orderby pl.Field<int>("Age") descending select pl;
foreach (var item in query2)
{
Console.WriteLine("姓名{0},年龄{1}",item.Field<string>("Name"),item.Field<int>("Age"));
}
//查询所有年龄在20到40之间的记录
var query3 = from pl in dt.AsEnumerable()
where pl.Field<int>("Age") > 20 && pl.Field<int>("Age") < 40
orderby pl.Field<int>("Age") ascending
select pl;
foreach (var item in query3)
{
Console.WriteLine("姓名{0},年龄{1}", item.Field<string>("Name"), item.Field<int>("Age"));
}
}
特别注意到的错误:
第一部分是手动创建Datable列表,
dt.Columns.AddRange给Datatable创建表结构,在下面for循环里进行给行添加数据的时候,DataRow dr =new DataRow(),这种写法是十分错误的
DataRow表示是DataTable中的一行数据,要实例化DataRow必须先实例Datatable,DataTable要确定DataaRow的结构。
DataRow的构造函数如下:
protected internal DataRow (
DataRowBuilder builder
)
DataRow是一个受保护的internal类。
internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。
一、ms这么做是有他的隐含意思在里面的:
一个table和他对应的row应该是有相同结构的,为了保证他们结构相同,就必须按照一个统一标准来规范他们.要么用table来规范row,那么让row去格式化table,ms选择了前一种方式,这里他们又隐含一层意思,那就是生成的顺序,table比row先生成.
所以为了严格保证这种规范和生成顺序,该构造函数就限制成了protected internal ,ok了,这么做,你就是想把table和row结构不对应都不成了,因为他没有留给你任何犯错的机会
所以这里我们应该使用 DataRow dr = dt.newRow();
简单来说,Linq to DataSet 查询Datatable 可以简单分成两部分,将DataTable转换成IEnumberable<T>数据集合,然后是对集合进行操作
标签:必须 alt system new rom com datatable 严格 tar
原文地址:https://www.cnblogs.com/wangcongsuibi/p/8867083.html