<%@ Page Language="C#" AutoEventWireup="true" CodeFile="LinqDemo.aspx.cs" Inherits="LinqDemo" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Linq强大查询功能</title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> <asp:GridView ID="GridView2" runat="server"> </asp:GridView> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; public partial class LinqDemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Linq筛选示例 int[] strocs = { 75, 80, 98, 78, 86, 65, 50, 90 }; var highScoresQuery = (from stroc in strocs orderby stroc ascending where stroc >= 90 select stroc).Max(); Response.Write(highScoresQuery + "<br>"); /* 从中可以看出学生“李四”没有成绩,所以不在查询query1的结果中。 Query1-所有学生成绩: 姓名:张三, 数学:80, 语文:75, 英语:78 姓名:王霞, 数学:88, 语文:80, 英语:60 姓名:赵敏, 数学:75, 语文:90, 英语:80 姓名:吴安, 数学:59, 语文:80, 英语:75 */ QueryStuScores(); /* Query2-没有成绩的学生:姓名:李四, 性别:男, 年龄:19 Query3-没有成绩的学生:姓名:李四, 性别:男, 年龄:19 */ QueryNoneScoreStu(); /* 查询query1年龄大于20且具有成绩的学生 显示: 学生列表: 姓名:王霞, 性别:女, 年龄:21 姓名:赵敏, 性别:女, 年龄:22 * */ UseCopyToDTSimple(); CreateDataVeiw(); } protected DataSet BuildDataSet() { //创建Students数据集 DataSet ds = new DataSet("Students"); //创建Students数据表dtStu,并添加到数据集ds中 //Students数据表包含学生信息 DataTable dtStu = new DataTable("Students"); ds.Tables.Add(dtStu); //添加学生信息记录的列信息,包括4列数据: //姓名:Name,string类型 //性别:XingBie,string类型 //年龄:Age,int类型 //成绩编号:ScoreID,int类型 dtStu.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")), new DataColumn("ScoreID", Type.GetType("System.Int32")), }); //添加5个学生信息到数据表dtStu中,分别包括姓名、性别、年龄和成绩编号 dtStu.Rows.Add("张三", "男", 20, 1); dtStu.Rows.Add("李四", "男", 19, 2); dtStu.Rows.Add("王霞", "女", 21, 3); dtStu.Rows.Add("赵敏", "女", 22, 4); dtStu.Rows.Add("吴安", "男", 18, 5); //创建Scores数据表,并添加到数据集 //Scores数据表包含学生成绩记录 DataTable dtScore = new DataTable("Scores"); ds.Tables.Add(dtScore); //添加成绩记录表的列(字段)信息,包含4个字段: //成绩编号:ScoreID,int类型,与Students表的ScoreID字段对应 //数学成绩:Math,int类型 //语文成绩:Chinese,int类型 //英语成绩:English,int类型 dtScore.Columns.AddRange(new DataColumn[]{ new DataColumn("ScoreID", Type.GetType("System.Int32")), new DataColumn("Math", Type.GetType("System.Int32")), new DataColumn("Chinese", Type.GetType("System.Int32")), new DataColumn("English", Type.GetType("System.Int32")), }); //添加学生成绩记录,分别包括成绩编号、数学成绩、语文成绩、英语成绩 dtScore.Rows.Add(1, 80, 75, 78); dtScore.Rows.Add(3, 88, 80, 60); dtScore.Rows.Add(4, 75, 90, 80); dtScore.Rows.Add(5, 59, 80, 75); //返回数据集 return ds; } protected void QueryStuScores() { DataSet ds = BuildDataSet(); //获取数据集ds DataTable dtStu = ds.Tables["Students"]; //从数据集ds中获取Students表dtStu DataTable dtScore = ds.Tables["Scores"]; //从数据集ds中获取Scores表dtScore var query1 = //查询query1查询所有学生的成绩 from stu in dtStu.AsEnumerable() //从Students表和Scores表中查询 from score in dtScore.AsEnumerable() where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID") //成绩编号(ScoreID)相等 select new //匿名类型为查询结果元素类型,包括四个成员 { Name = stu.Field<string>("Name"), MathS = score.Field<int>("Math"), Chinese = score.Field<int>("Chinese"), English = score.Field<int>("English") }; HttpContext.Current.Response.Write("Query1-所有学生成绩:<br/>"); foreach (var item in query1) //打印查询query1的结果 { string ResTxt = string.Format("姓名:{0}, 数学:{1}, 语文:{2}, 英语:{3}", item.Name, item.MathS, item.Chinese, item.English); HttpContext.Current.Response.Write(ResTxt + "<br/>"); } } protected void QueryNoneScoreStu() { DataSet ds = BuildDataSet(); //获取数据集ds DataTable dtStu = ds.Tables["Students"]; //从数据集ds中获取Students表dtStu DataTable dtScore = ds.Tables["Scores"]; //从数据集ds中获取Scores表dtScore var scoreIDs = //查询scoreIDs查询所有有成绩的学生的成绩编号 from score in dtScore.AsEnumerable() select score.Field<int>("ScoreID"); var query2 = //查询query2查询所有成绩号不在查询scoreIDs中学生信息 from stu in dtStu.AsEnumerable() where !scoreIDs.Contains<int>(stu.Field<int>("ScoreID")) select stu; HttpContext.Current.Response.Write("Query2-没有成绩的学生:"); foreach (var item in query2) //打印查询query2的结果 { string ResTxt = string.Format("姓名:{0}, 性别:{1}, 年龄:{2}", item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age")); HttpContext.Current.Response.Write(ResTxt + "<br/>"); } var scrStu = //查询scrStu查询所有具有成绩信息的学生 from stu in dtStu.AsEnumerable() from score in dtScore.AsEnumerable() where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID") select stu; //查询query3是从所有学生记录中剔除具有成绩的学生。 var query3 = dtStu.AsEnumerable().Except(scrStu); HttpContext.Current.Response.Write("Query3-没有成绩的学生:"); foreach (var item in query3) //打印查询query3的结果 { string ResTxt = string.Format("姓名:{0}, 性别:{1}, 年龄:{2}", item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age")); HttpContext.Current.Response.Write(ResTxt + "<br/>"); } } protected void UseCopyToDTSimple() { DataSet ds = BuildDataSet(); //获取数据集ds DataTable dtStu = ds.Tables["Students"]; //从数据集ds中获取Students表dtStu DataTable dtScore = ds.Tables["Scores"]; //从数据集ds中获取Scores表dtScore var query1 = //查询query1年龄大于20且具有成绩的学生 from stu in dtStu.AsEnumerable() from score in dtScore.AsEnumerable() where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID") where (int)stu["Age"] > 20 select stu; //通过CopyToDataTable()方法创建新的副本 //然后打印该副本的信息 通常用于界面绑定 DataTable newDt = query1.CopyToDataTable<DataRow>(); HttpContext.Current.Response.Write("学生列表:<br/>"); foreach (var item in newDt.AsEnumerable()) //打印该副本的信息 { string ResTxt = string.Format("姓名:{0}, 性别:{1}, 年龄:{2}", item["Name"], item["XingBie"], item["Age"]); HttpContext.Current.Response.Write(ResTxt + "<br/>"); } } protected void CreateDataVeiw() { DataSet ds = BuildDataSet(); //获取数据集ds DataTable dt = ds.Tables["Students"]; //从数据集ds获取Students表dt //用DataTable.AsDataView()方法从数据表dt创建DataView对象dvDt DataView dvDt = dt.AsDataView(); //query1用LINQ查询创建DataView对象dvDt,查询它所有的元素 EnumerableRowCollection<DataRow> query1 = from stu in dt.AsEnumerable() select stu; DataView dvNml = query1.AsDataView(); //获取查询query1产生的DataView //query2用LINQ查询创建具有过滤信息的DataView,查询所有姓“张”的学生 EnumerableRowCollection<DataRow> query2 = from stu in dt.AsEnumerable() where stu.Field<string>("Name").StartsWith("张") select stu; DataView dvFilter = query2.AsDataView(); //获取查询query2产生的DataView //query3用LINQ查询创建具有排序信息的DataView,将学生按照从小到大的顺序排序 EnumerableRowCollection<DataRow> query3 = from stu in dt.AsEnumerable() orderby stu.Field<int>("Age") select stu; DataView dvSort = query3.AsDataView(); //获取查询query3产生的DataView //绑定显示 GridView1.DataSource = dvFilter; GridView1.DataBind(); GridView2.DataSource = dvSort; GridView2.DataBind(); } }