Linq to DataSet 上篇
相对于 Linq to Object ,Linq to DataSet 要显得更为复杂一些,
因为 DataSet 本身就是一个比较复杂的对象,
事实上,可以将 DataSet 看做是存放在内存中的一个小型的关系型数据库,
换而言之,Linq to DataSet 也就是接近数据库查询 Linq to SQL 了,
理所当然的会显得复杂一些,
所以在此,Linq to DataSet 将分为两篇博文分别介绍,
在使用 Linq to DataSet ,其实也是分为两种场合的,
第一种就是 DataSet 是自己实例化生成的,
也就是使用 DataSet Ds=new DataSet() 实例化的一个对象,
也没有涉及.xsd 的处理,
也就是 DataSet 为弱类型时的处理,
在这种情况下,基本上,
对于 DataSet 的操作也就是基于其中的几个简单的数据表的操作,
不会涉及太过复杂的内容,
所以只要掌握了基本的通路以及一些需要注意的地方,
那么便也会显得很简单的,
直接看 Demo
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace CSharpLanguage
{
public partial class Demo__6 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//由于 DataTable 本身是既没有实现 IEnumberable,
//也没有实现 IEnumerable<T> 接口
//必须依靠方法 AsEnumerable 来以一个
//实现了 IEnumberable 或者 IEnumberable<T> 接口的对象呈现
//只有这样才能使用 Linq to DataSet 实现查询
//否则会报出以下错误
//错误 1 无法将 lambda 表达式 转换为类型“string”,
//因为它不是委托类型
var result = from p in GetDataSet().Tables[0].AsEnumerable()
select new
{
//这里则是明确使用 Linq to DataSet 查询后
//各个列均以确定的数据类型返回
StudentID = p.Field<string>("身份证号码"),
StudentName = p.Field<string>("学生姓名"),
StudentSex = p.Field<bool>("性别")
};
GridView1.DataSource = result;
GridView1.DataBind();
}
private DataSet GetDataSet()
{
string conStr = ConfigurationManager.ConnectionStrings["Demo"].
ConnectionString;
string sqlStr = "SELECT 身份证号码,学生姓名,性别," +
"家长姓名,家庭地址 FROM 学生";
DataSet Ds = new DataSet();
using (SqlConnection sqlCon = new SqlConnection(conStr))
{
using (SqlCommand sqlCom = new SqlCommand(sqlStr, sqlCon))
{
using (SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCom))
{
sqlDa.Fill(Ds);
}
}
}
return Ds;
}
}
}
看一下结果的截图
以上就是整个 Demo 的 Code-Behind 了,简单吧,
不过还是要注意一些地方的,尤其是下面这一句
var result = from p in GetDataSet().Tables[0].AsEnumerable()
这一句,就是将 DataTable 使用 AsEnumerable() 方法来实现作为一个
实现了 IEnumerable 或者 IEnumerable <T> 接口的对象返回,
只有这样才可以使用 Linq to DataSet ,
然后需要理解的就是其中的
StudentID = p.Field<string>("身份证号码"),StudentName = p.Field<string>("学生姓名"),
StudentSex = p.Field<bool>("性别")
事实上,你也可以改为
身份证 = p.Field<string>("身份证号码"),
姓名 = p.Field<string>("学生姓名"),
性别 = p.Field<bool>("性别")
因为那只是一个名称,并不代表什么意思,
不过后面的字段名称则必须和 DataTable 中的列名一致了
说白了也就是一个 DataRow[“身份证号码”] ,
不过在这里使用了 p.Filed<string> 这类的标签进行修饰,
那么便有所不同了,DataRow[“身份证号码”] 返回的也就一个 string,
而使用了p.Filed<string> 这类的标签修饰后便会是返回特定类型的数据了,
比如身份证号码在经 Linq to DataSet 后在 GridView中便是 string 类型了,
而性别这个字段便是 Bool 类型了。
2010—2—01