zoukankan      html  css  js  c++  java
  • 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();
        }
    }


  • 相关阅读:
    最短路径-Dijkstra算法(转载)
    递归算法到非递归算法的转换
    向量点乘(内积)和叉乘(外积、向量积)概念及几何意义(转载)
    数据预处理之独热编码(One-Hot Encoding)(转载)
    MyEclipse中手工添加dtd支持
    怎样sublime显示文件夹
    sublime_Text3中snippet设置信息头(包括作者、日期)
    解决Sublime_Text不能安装插件的方法
    Python设置默认编码为UTF-8
    解决火狐启动缓慢的方法
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234354.html
Copyright © 2011-2022 走看看