Linq強大的查詢功能,以及DataSet中多表之間交叉查詢,欄位過濾,篩選等

smartsmile2012發表於2012-12-04
<%@ 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();
    }
}


相關文章