Linq强大的查询功能,以及DataSet中多表之间交叉查询,字段过滤,筛选等

来源:互联网 发布:策略一二三网络 编辑:程序博客网 时间:2024/05/05 00:14
<%@ 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();    }}