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

<%@ 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();
    }
}


posted @ 2012-12-04 10:29  深南大道  阅读(275)  评论(0编辑  收藏  举报