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