LInq是Language Integrated Query的簡(jiǎn)稱,它是微軟在.net framework 3.5里面新加入的特性,用以簡(jiǎn)化查詢查詢操作。它主要包含了3塊,Linq to Object、Linq to SQL、Linq to XML,其中Linq to Object和對(duì)于對(duì)象的查詢,Linq to XML則又提供了對(duì)XML格式數(shù)據(jù)的檢索、設(shè)置等功能,其中值得關(guān)注的Linq to SQL是我們要重點(diǎn)掌握的,因?yàn)樗淖兞宋覀儌鹘y(tǒng)的對(duì)于SQL操作的認(rèn)識(shí)。
一、Linq to Object
先上一段代碼:
string[] contries = new string[] { "china", "russia", "american", "spain", "japan", "china" }; var query = from c in contries select c;//Linq to object IEnumerator enumerator = query.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
注意Linq to Object的語(yǔ)法,from c in contries select c ; // 這里的c任意起名,in后面的contries 為數(shù)組對(duì)象或者是列表、集合等對(duì)象,select c 與前面的c保持一致。這是Linq強(qiáng)大的地方,試想我們以前要想查詢數(shù)組里面的每一個(gè)元素要寫一層for循環(huán)然后循環(huán)輸出。這里似乎看不出什么明顯優(yōu)勢(shì)的地方,我們繼續(xù)往下看。
var query = from c in contries select c; 替換為: var query = from c in contries.Distinct() where c.Length == 5 orderby c ascending select c;
我們會(huì)發(fā)現(xiàn)利用linq可以很容易的像利用sql語(yǔ)句一樣查詢、排序,如果利用原始的技術(shù)可能要多些好幾行代碼!
再舉個(gè)例子。
這是論壇某個(gè)壇友發(fā)的帖子,問(wèn)如何用Linq進(jìn)行分組查詢。見linq分組統(tǒng)計(jì)。
我在里面給出了解答,當(dāng)然了里面的List完全可以是從數(shù)據(jù)庫(kù)中獲取,我簡(jiǎn)單模擬了一下,代碼如下。
定義1個(gè)實(shí)體類:
public class Product { public Product(string province, Int32 value) { this.Province = province; this.Value = value; } public string Province { get; set; } public Int32 Value { get; set; } }
然后在Main函數(shù)中輸入:
var result = from p in list.AsEnumerable() group p by p.Province into g select new { g.Key, SumValue = g.Sum(p => p.Value) }; result.ToList().ForEach((i) => { Console.WriteLine(i.Key + ":" + i.SumValue); });
可以得到分組統(tǒng)計(jì)的結(jié)果。
再附一個(gè)簡(jiǎn)單排序的例子。linq排序
二、Linq to SQL
這是Linq技術(shù)的重頭戲,當(dāng)然現(xiàn)在有了EntityFramework等技術(shù),但是我們還是可以關(guān)注一下。
我們新建兩張表,很簡(jiǎn)單。
然后在項(xiàng)目中新建一個(gè)Linq to SQL類,切換到設(shè)計(jì)界面。同時(shí)打開服務(wù)資源管理器,添加數(shù)據(jù)連接,連接到數(shù)據(jù)庫(kù)。拖動(dòng)classInfo和studentInfo兩張表到Linq to SQL類文件的設(shè)計(jì)界面,我們會(huì)發(fā)現(xiàn)關(guān)系替我們都準(zhǔn)備的好好的。
OK,這時(shí)就可以寫相應(yīng)代碼,進(jìn)行添加操作了。
DataClasses1DataContext datacontext = new DataClasses1DataContext(); classInfo classInfo = new classInfo() { classId = 1, className = "grade1" }; datacontext.classInfo.InsertOnSubmit(classInfo); studentInfo studentInfo = new studentInfo() { studentId = "001", studentName = "liming", classId = 1 }; datacontext.studentInfo.InsertOnSubmit(studentInfo); datacontext.SubmitChanges();
這樣就添加了1條班級(jí)記錄和1條學(xué)生記錄。
如果我們要?jiǎng)h除一條學(xué)生記錄怎么辦?舉個(gè)例子,鍵入如下代碼:
DataClasses1DataContext datacontext = new DataClasses1DataContext(); studentInfo studentInfo = datacontext.studentInfo.Single(c => c.studentName == "liming"); datacontext.studentInfo.DeleteOnSubmit(studentInfo); datacontext.SubmitChanges();
這樣就把liming這個(gè)學(xué)生記錄給刪除了,很簡(jiǎn)單吧?
好,現(xiàn)在我們修改這個(gè)學(xué)生記錄,把名字改成zhang3。
DataClasses1DataContext datacontext = new DataClasses1DataContext(); studentInfo studentInfo = datacontext.studentInfo.Single(c => c.studentName == "liming"); studentInfo.studentName = "zhang3";//直接賦新的值 datacontext.SubmitChanges();//提交更改就可以了
補(bǔ)充一點(diǎn)很重要的,就是如何用linq to sql來(lái)進(jìn)行查詢操作。
前面的Single其實(shí)就是一種查詢操作,返回單個(gè)對(duì)象。
直接上一個(gè)linq帶條件的分頁(yè)查詢實(shí)例:
DataClasses1DataContext datacontext = new DataClasses1DataContext(); var singleStudent = from s in datacontext.studentInfo where s.studentName != "zhang3" orderby s.classInfo descending select s; IList<studentInfo> studentList = singleStudent.Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList(); foreach (studentInfo student in studentList) { Console.WriteLine("studentId:" + student.studentId + "studentName:" + student.studentName); }
三、Linq to XML
以前我們操作XML一般都用XmlDocument、XmlReader等核心類去處理,關(guān)于這個(gè)我在點(diǎn)擊打開鏈接這個(gè)帖子中已經(jīng)簡(jiǎn)單總結(jié)了一把。這里我們看看Linq是怎么處理XML的。
1、創(chuàng)建XML
XElement contacts = new XElement("Students", new XElement("Student", new XElement("Name", "Xiao Ming"), new XElement("Phone", "99599", new XAttribute("Type", "Home")), new XElement("phone", "010-99599", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street", "123 Street"), new XElement("City", "123 City"), new XElement("State", "1"), new XElement("Postal", "0000000") ) ) ); contacts.Save("test.xml");
你會(huì)發(fā)現(xiàn),你只要記住XElement這一個(gè)核心類就可以使用Linq創(chuàng)建xml,而且編碼的方式很輕松,就是在表達(dá)一個(gè)xml的層級(jí)關(guān)系。
效果如下:
<?xml version="1.0" encoding="utf-8"?> <Students> <Student> <Name>Xiao Ming</Name> <Phone Type="Home">99599</Phone> <phone Type="Work">010-99599</phone> <Address> <Street>123 Street</Street> <City>123 City</City> <State>1</State> <Postal>0000000</Postal> </Address> </Student> </Students>
2、查詢XML
還是用上面生成的XML來(lái)做測(cè)試,鍵入如下代碼:
XElement root = XElement.Load("test.xml"); IEnumerable address = from el in root.Elements("Student").Elements("phone") where el.Attribute("Type").Value == "Work" select el; foreach (XElement el in address) { Console.WriteLine(el.Value); }
輸出:010-99599。
四、Linq to DataTable
意思跟Linq to Object是一樣的,應(yīng)該屬于Linq to Object的范疇,這里單獨(dú)拿出來(lái),分享一下。
舉個(gè)例子,對(duì)兩個(gè)DataTable的數(shù)據(jù)進(jìn)行合并,原貼見:兩個(gè)DataTable合并列。
先構(gòu)造兩個(gè)DataTable。
DataTable A = new DataTable(); A.Columns.Add("NameNumber", typeof(string)); A.Columns.Add("Type", typeof(string)); DataRow drA = null; drA = A.NewRow(); drA["NameNumber"] = "111"; drA["Type"] = "Y"; A.Rows.Add(drA); drA = A.NewRow(); drA["NameNumber"] = "222"; drA["Type"] = "N"; A.Rows.Add(drA); DataTable B = new DataTable(); B.Columns.Add("NameNumber", typeof(string)); B.Columns.Add("Name", typeof(string)); B.Columns.Add("Address", typeof(string)); DataRow drB = null; drB = B.NewRow(); drB["NameNumber"] = "111"; drB["Name"] = "張三"; drB["Address"] = "上海"; B.Rows.Add(drB); drB = B.NewRow(); drB["NameNumber"] = "222"; drB["Name"] = "李四"; drB["Address"] = "北京"; B.Rows.Add(drB);
然后我們通過(guò)Linq to DataTable進(jìn)行合并。
var result = from p in A.AsEnumerable() from q in B.AsEnumerable() where p.Field<string>("NameNumber") == q.Field<string>("NameNumber") select new { NameNumber = p.Field<string>("NameNumber"), Type = p.Field<string>("Type"), Address = q.Field<string>("Address") }; result.ToList().ForEach(x => Console.WriteLine(x.NameNumber + "-" + x.Type + "-" + x.Address));
效果圖下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。