CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
一个DataSet通常包含一个或多个DataTable,同时也包括它们之间的关系集合等,实际上可以把它看成是一个缩影的数据库。LINQ to DataSet也是对一个或多个DataTable进行查询,这些DataTable可以来自单个DataSet,也可以是来自多个DataSet。
LINQ to DataSet的使用通常包含以下步骤:
(1)获取DataSet/DataTable数据源
(2)将DataTable转换成IEnumerable<T>类型。LINQ只能在IEnumerable<T>或IQueryable<T>接口对象上执行查询操作,而 DataTable并没有实现这两个接口,不能直接查询。在LINQ to DataSet中,通过DataTableExtensions扩展的AsEnumerable()方法从DataTable获取一个等价的IEnumerable<T>对象。
(3)使用LINQ语法编写查询。
注意:由于DataSet本身是DataTable的集合,它可以包含一个或多个DataTable及它们之间的关系,LINQ to DataSet实际是对DataTable进行数据查询,并非对DataSet进行查询。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace LinqToDataSet
{
class Program
{
static void Main(string[] args)
{
UseSelect();
Console.Read();
}
/// <summary>
/// 造一个dataset数据集
/// </summary>
/// <returns></returns>
static DataSet BuildOneDTDataSet()
{
//可选姓名、性别和年龄,用于创建学生数据到数据表中
string[] nameSet = { "王霞", "张三", "李四", "李花", "王五", "陆六", "夏七", "吴八" };
string[] xbSet = { "女", "男", "男", "女", "男", "男", "男", "男" };
int[] ageSet = { 18, 20, 21, 22, 19, 20, 25, 24 };
DataSet ds = new DataSet("PeopleDS"); //创建名为PeopleDS的DataSet对象
DataTable dt = new DataTable("PeopleDT"); //创建名为PeopleDT的DataTable对象
ds.Tables.Add(dt); //将数据表dt添加到数据集ds中
//创建DataTable的列(字段)信息,包括3个字段:
//姓名:Name,string类型
//性别:XingBie,string类型
//年龄:Age,int类型
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")),
});
//利用前面定义的可选姓名nameSet、年龄ageSet、性别xbSet创建多个学生信息
for (int i = 0; i < nameSet.Length; i++)
{
//根据当前编号,自动新建数据表中的一行,并产生一行数据
//然后通过DataTable.Rows.Add()将这一行添加到数据表dt中
DataRow row = dt.NewRow();
row["Name"] = nameSet[i];
row["Age"] = ageSet[i];
row["XingBie"] = xbSet[i];
dt.Rows.Add(row); //添加到数据表dt中
}
return ds; //返回DataSet
}
static void UseSelect()
{
DataSet ds = BuildOneDTDataSet(); //获取数据集ds
DataTable dt = ds.Tables["PeopleDT"]; //从数据集ds中获取名为“PeopleDT”的数据表dt
//查询query1表示查询DataTable中所有记录,演示AsEnumerable()的使用
//返回EnumerableRowCollection<DataRow>集合
var query1 = from pl in dt.AsEnumerable() select pl;
System.Console.WriteLine("Query1:");
foreach (var item in query1)
{
//演示Field<T>方法的使用
//Console.WriteLine("姓名:{0},性别:{1},年龄:{2}",item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age"));
Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", item["Name"], item["XingBie"], item["Age"]);
}
//查询query2表示查询DataTable中所有人的姓名,演示AsEnumerable()和Field<T>的使用
var query2 = from pl in dt.AsEnumerable() select pl.Field<string>("Name");
System.Console.WriteLine("Query2:"); //打印查询query1的结果
foreach (var item in query2)
{
System.Console.Write("{0} ", item);
}
System.Console.WriteLine();
//查询query3 where 返回list<datarow>
var query3 = dt.AsEnumerable().Where(r => r.Field<int>("Age") > 24).ToList();
System.Console.WriteLine("Query3:"); //打印查询query3的结果
foreach (DataRow dr in query3)
{
//读取datarow值
System.Console.Write("{0} ", dr.Field<string>("Name"));
System.Console.Write("{0} ", dr["age"].ToString());
//修改datarow值
//dr.SetField<int>("age", dr.Field<int>("Age") + 100);
dr["age"] = Convert.ToInt32(dr["age"]) + 1001;
}
foreach (DataRow dr in query3)
{
System.Console.Write("{0} ", dr.Field<string>("Name"));
System.Console.Write("{0} ", dr["age"].ToString());
}
}
}
}