先把準(zhǔn)備工作做好,這步可以不看,創(chuàng)建一個(gè)數(shù)據(jù)庫和兩張表,下面是創(chuàng)建語句,很簡(jiǎn)單,大家都看得懂.
第一步:創(chuàng)建表和初始化數(shù)據(jù)
--創(chuàng)建數(shù)據(jù)庫Student create database Student go use Student --創(chuàng)建數(shù)據(jù)表T_Student create table T_Student( ID int not null identity primary key, Name varchar(20) not null, EnglishName varchar(20) not null, Age int, Birthday date, Country varchar(50) ) --創(chuàng)建數(shù)據(jù)表T_Score,設(shè)置主外鍵關(guān)系 create table T_Score( ID int not null identity primary key, StudentID int not null foreign key references T_Student(ID), English varchar(20) not null, Math varchar(20) not null, Chinese varchar(20) not null ) go --向T_Student插入數(shù)據(jù) insert into T_Student select '李正興','Black_Li',19,'1991-03-17','江蘇鹽城' union select '羅海','Jason',21,'1991-10-17','江蘇南京' union select '張士陽','Huk',35,'1991-12-18','安徽阜陽' union select '呂佳惠','Lily',23,'1991-06-23','四川' union select '金琢','Babylon',23,'1991-03-15','江蘇揚(yáng)州' --向T_Score插入數(shù)據(jù) insert into T_Score select 1,'90','84','68' union select 2,'87','78','78' union select 3,'79','87','88' union select 4,'95','84','89' union select 5,'90','84','58' go 學(xué)生表:成績(jī)表:
第二步:創(chuàng)建兩張表對(duì)應(yīng)的實(shí)體
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LinqDemo { /// <summary> /// 學(xué)生實(shí)體類 /// </summary> public class Student { #region 屬性 public int ID { get; set; } public string Name { get; set; } public string EnglishName { get; set; } public int Age { get; set; } public DateTime Birthday { get; set; } public string Country { get; set; } #endregion #region 方法 /// <summary> /// 重寫Object類的ToString()方法 /// </summary> /// <returns></returns> public override string ToString() { return string.Format("學(xué)號(hào):{0},姓名:{1},英文名:{2},年齡:{3},生日:{4},家鄉(xiāng):{5}", this.ID, this.Name, this.EnglishName, this.Age, this.Birthday, this.Country); } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LinqDemo { /// <summary> /// 成績(jī)表實(shí)體 /// </summary> public class Score { #region 屬性 public int ID { get; set; } public int StudentID { get; set; } public string English { get; set; } public string Math { get; set; } public string Chinese { get; set; } #endregion #region 方法 /// <summary> /// 重寫Object類的ToString()方法 /// </summary> /// <returns></returns> public override string ToString() { return string.Format("學(xué)號(hào):{0},英語:{1},數(shù)學(xué):{2},語文:{3}", this.StudentID, this.English, this.Math, this.Chinese); } #endregion } }
第三步:創(chuàng)建學(xué)生管理類(其中用到了自己寫的SQLHelper,也貼出來)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace LinqDemo { /// <summary> /// 學(xué)生管理類 /// </summary> public class StudentManage { private string commandText = string.Empty; DataTable table = null; /// <summary> /// 獲取所有學(xué)生信息 /// </summary> /// <returns></returns> public List<Student> GetAllStudents() { //創(chuàng)建一個(gè)集合 List<Student> list = new List<Student>(); commandText = @"SELECT [ID] ,[Name] ,[EnglishName] ,[Age] ,[Birthday] ,[Country] FROM [Student].[dbo].[T_Student]"; //執(zhí)行Sql語句,查出所有的學(xué)生信息 table = SQLHelper.ExecuteDataTable(commandText); //遍歷添加到list集合中 for (int i = 0; i < table.Rows.Count; i++) { list.Add(new Student() { ID = Convert.ToInt32(table.Rows[i]["ID"]), Name = table.Rows[i]["Name"].ToString(), EnglishName = table.Rows[i]["EnglishName"].ToString(), Age = Convert.ToInt32(table.Rows[i]["Age"]), Birthday = Convert.ToDateTime(table.Rows[i]["Birthday"]), Country = table.Rows[i]["Country"].ToString() }); } return list; } /// <summary> /// 獲取所有成績(jī)信息 /// </summary> /// <returns></returns> public List<Score> GetAllScores() { //創(chuàng)建一個(gè)集合 List<Score> list = new List<Score>(); commandText = @"SELECT [ID], [StudentID], [English], [Math], [Chinese] FROM [Student].[dbo].[T_Score]"; //執(zhí)行Sql語句,查出所有的學(xué)生信息 table = SQLHelper.ExecuteDataTable(commandText); //遍歷添加到list集合中 for (int i = 0; i < table.Rows.Count; i++) { list.Add(new Score() { ID = Convert.ToInt32(table.Rows[i]["ID"]), StudentID = Convert.ToInt32(table.Rows[i]["StudentID"]), English = table.Rows[i]["English"].ToString(), Math = table.Rows[i]["Math"].ToString(), Chinese = table.Rows[i]["Chinese"].ToString() }); } return list; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace LinqDemo { /// <summary> /// 后臺(tái)數(shù)據(jù)執(zhí)行類 /// </summary> public class SQLHelper { #region ExecuteNonQuery()方法 返回一個(gè)int值 /// <summary> /// 執(zhí)行ExecuteNonQuery并返回結(jié)果,靜態(tài)函數(shù)可由類SQLHelper直接調(diào)用 /// </summary> /// <param name="commandText">sql語句命令</param> /// <param name="parameters">用戶傳過來的參數(shù)集合</param> /// <returns>返回一個(gè)int值</returns> public static int ExecuteNonQuery(string commandText, params SqlParameter[] parameters) { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//建立連接字符串 using (SqlConnection conn = new SqlConnection(connStr))//創(chuàng)建一個(gè)連接 { conn.Open();//打開連接 using (SqlCommand cmd = conn.CreateCommand())//創(chuàng)建命令 { cmd.CommandText = commandText;//sql命令是用戶傳過來的命令 //遍歷傳過來的參數(shù) foreach (SqlParameter p in parameters) { cmd.Parameters.Add(p); } return cmd.ExecuteNonQuery();//執(zhí)行命令,并返回執(zhí)行結(jié)果 } } } #endregion #region ExecuteScalar()方法 返回一個(gè)object值 /// <summary> /// 執(zhí)行ExecuteScalar并返回結(jié)果,靜態(tài)函數(shù)可由類SQLHelper直接調(diào)用 /// </summary> /// <param name="commandText">sql語句命令</param> /// <param name="parameters">用戶傳過來的參數(shù)集合</param> /// <returns>返回一個(gè)object值</returns> /* 舉例:cmd.CommandText = "SELECT COUNT(*) FROM T_Persons"; Int32 count = (Int32)cmd.ExecuteScalar(); 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其他列或行。 */ public static object ExecuteScalar(string commandText, params SqlParameter[] parameters) { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//建立連接字符串 using (SqlConnection conn = new SqlConnection(connStr))//創(chuàng)建一個(gè)連接 { conn.Open();//打開連接 using (SqlCommand cmd = conn.CreateCommand())//創(chuàng)建命令 { cmd.CommandText = commandText;//sql命令是用戶傳過來的命令 //遍歷傳過來的參數(shù) foreach (SqlParameter p in parameters) { cmd.Parameters.Add(p); } return cmd.ExecuteScalar();//執(zhí)行命令,并返回執(zhí)行結(jié)果 } } } #endregion #region ExecuteDataTable()方法 返回一個(gè)DataTable值 /// <summary> /// 執(zhí)行ExecuteDataTable并返回結(jié)果,靜態(tài)函數(shù)可由類SQLHelper直接調(diào)用 /// </summary> /// <param name="commandText">sql語句命令</param> /// <param name="parameters">用戶傳過來的參數(shù)集合</param> /// <returns>返回一個(gè)DataTable值</returns> public static DataTable ExecuteDataTable(string commandText, params SqlParameter[] parameters) { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//建立連接字符串 using (SqlConnection conn = new SqlConnection(connStr))//創(chuàng)建一個(gè)連接 { conn.Open();//打開連接 using (SqlCommand cmd = conn.CreateCommand())//創(chuàng)建命令 { cmd.CommandText = commandText;//sql命令是用戶傳過來的命令 DataSet dataset = new DataSet();//新建一個(gè)數(shù)據(jù)集,把查詢數(shù)據(jù)保存到本地?cái)?shù)據(jù)集中 SqlDataAdapter adapter = new SqlDataAdapter(cmd);//創(chuàng)建一個(gè)適配器adapter //遍歷傳過來的參數(shù) foreach (SqlParameter p in parameters) { cmd.Parameters.Add(p); } adapter.Fill(dataset);//向數(shù)據(jù)集中填充數(shù)據(jù) DataTable table = dataset.Tables[0];//將dataset中的查詢結(jié)果(一般第一個(gè)表)保存起來 return table;//執(zhí)行命令,并返回執(zhí)行結(jié)果 } } } #endregion } }
第四步:LINQ開始,在Program.cs類中
static void Main(string[] args) { DoWork(); Console.ReadKey(); } /// <summary> /// 做某些操作函數(shù) /// </summary> static void DoWork() { //創(chuàng)建學(xué)生管理對(duì)象 StudentManage SM = new StudentManage(); //獲取所有學(xué)生存放于集合students中 List<Student> students = SM.GetAllStudents(); //獲取所有成績(jī)存放于集合scores中 List<Score> scores = SM.GetAllScores(); }
A、查詢
//查詢語句,將所有學(xué)生姓名取出來放入集合中 //IEnumerable<string> names = students.Select(s=>s.Name); //或者 IEnumerable<string> names = from s in students select s.Name; foreach (string name in names) { Console.WriteLine(name); } 結(jié)果:
var stus = students.Select(s=>new { Name = s.Name, Age = s.Age }); //或者 //var stus = from s in students select new { Name = s.Name, Age = s.Age }; foreach (var s in stus) { Console.WriteLine(s); }
結(jié)果:
B、篩選
//篩選語句,將符合條件的學(xué)生姓名取出來 //IEnumerable<Student> stus = students.Where(stu => string.Equals(stu.Country,"四川")).Select(stu=>stu); //或者 IEnumerable<Student> stus = from stu in students where string.Equals(stu.Country, "四川") select stu; foreach (Student stu in stus) { Console.WriteLine(stu.ToString()); } 結(jié)果:
C、排序
//根據(jù)學(xué)號(hào)降序,默認(rèn)升序 //var stus = students.OrderByDescending(stu => stu.ID).Select(stu => new {Number=stu.ID,Name=stu.Name}); //或者 var stus = from stu in students orderby stu.ID descending select new { Number = stu.ID, Name = stu.Name }; foreach (var stu in stus) { Console.WriteLine(stu); } 結(jié)果:
D、分組
//根據(jù)年齡分組 //var stusGroup = students.GroupBy(stu=>stu.Age); //或者 var stusGroup = from stu in students group stu by stu.Age; //遍歷組信息 foreach (var grop in stusGroup) { Console.WriteLine("這是年齡為"+grop.Key+"組"); Console.WriteLine("該組成員如下:"); //遍歷組成員信息 foreach(var stu in grop) { Console.WriteLine("姓名:"+stu.Name+" 年齡:"+stu.Age); } Console.WriteLine(); } 結(jié)果:
E、結(jié)果集去除重復(fù)與計(jì)數(shù)
//取出所有年齡,過濾掉重復(fù),統(tǒng)計(jì)個(gè)數(shù) int number = students.Select(stu => stu.Age).Distinct().Count();
F、聯(lián)合查詢
//創(chuàng)建學(xué)生管理對(duì)象 StudentManage SM = new StudentManage(); //獲取所有學(xué)生存放于集合students中 List<Student> students = SM.GetAllStudents(); //獲取所有成績(jī)存放于集合scores中 List<Score> scores = SM.GetAllScores(); //聯(lián)合學(xué)生和成績(jī)表 //var StuScores = students.Select(stu => stu).Join (scores, stus => stus.ID, scors => scors.StudentID, (stus, scors) => new {stus.Name,stus.Age,scors.Chinese,scors.English}); //輸出 //或者 var StuScores = from stu in students join score in scores on stu.ID equals score.StudentID select new { stu.Name, stu.Age, score.Chinese, score.English }; foreach (var stuscore in StuScores) { Console.WriteLine(stuscore); } 結(jié)果: