西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → 什么是linq技術(shù)?LinQ如何開(kāi)發(fā)實(shí)現(xiàn)

什么是linq技術(shù)?LinQ如何開(kāi)發(fā)實(shí)現(xiàn)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2014/6/1 8:58:30字體大。A-A+

作者:西西點(diǎn)擊:82次評(píng)論:0次標(biāo)簽: linq

  • 類(lèi)型:數(shù)據(jù)庫(kù)類(lèi)大。1.7M語(yǔ)言:英文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

語(yǔ)言集成查詢(xún) (LINQ) 是一組技術(shù)的名稱(chēng),這些技術(shù)建立在將查詢(xún)功能直接集成到 C# 語(yǔ)言(以及 Visual Basic 和可能的任何其他 .NET 語(yǔ)言)的基礎(chǔ)上。 借助于 LINQ,查詢(xún)現(xiàn)在已是高級(jí)語(yǔ)言構(gòu)造,就如同類(lèi)、方法、事件等等。

(1)什么是linq技術(shù)?

這個(gè)是在《ASP.NET高級(jí)程序設(shè)計(jì)第四版》第一章節(jié)中講解asp.net版本中有關(guān)于該技術(shù)的起源背景,linq是asp.net 3.5 中跟AJAX一起在原來(lái)2.0版本上引入的一項(xiàng)新技術(shù)。

接下來(lái)是13章節(jié)中的一些知識(shí)點(diǎn)結(jié)合我自己的理解,其中我自己也存在兩點(diǎn)疑惑,如果有精通的希望能指導(dǎo)一番,哈哈,進(jìn)入正題:

linq:縮寫(xiě)是language integrated query 語(yǔ)言集成查詢(xún),是一項(xiàng)操作內(nèi)存數(shù)據(jù)的技術(shù),看完一個(gè)小節(jié),感覺(jué)跟sql查詢(xún)的區(qū)別就是它可以將一些數(shù)據(jù)類(lèi)對(duì)象執(zhí)行查詢(xún)過(guò)濾,返回自己請(qǐng)求的數(shù)據(jù),也即是說(shuō)它既可以實(shí)現(xiàn)c#源代碼環(huán)境中的對(duì)象數(shù)據(jù)查詢(xún),也可以實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)。

linq技術(shù)為我們開(kāi)發(fā)人員提供了五個(gè)比較實(shí)用的數(shù)據(jù)訪問(wèn)類(lèi)型:

LinQ to Object:可以允許對(duì)內(nèi)存中的類(lèi)對(duì)象查詢(xún)。

LinQ to DataSet:可以對(duì)內(nèi)存中的DataSet緩存數(shù)據(jù),執(zhí)行數(shù)據(jù)訪問(wèn)。

LinQ to xml :針對(duì)XML數(shù)據(jù)的一種解析封裝可以實(shí)現(xiàn)傳統(tǒng)xml解析效果。

LinQ to Entity:這是目前l(fā)inq技術(shù)比較流行的一個(gè)亮點(diǎn)了,它提供了對(duì)關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn),可以使得開(kāi)發(fā)者不必通過(guò)編寫(xiě)負(fù)責(zé)ADO.NET的數(shù)據(jù)訪問(wèn)層就可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問(wèn),也可以?xún)烧咭黄鸾Y(jié)合使。LinQ相對(duì)ADO.NET的優(yōu)勢(shì)在哪里呢?它真的有ADO.NET如此強(qiáng)大的數(shù)據(jù)訪問(wèn)功能呢?這是我今天的第一個(gè)疑問(wèn),或許還需要后面的學(xué)習(xí)才能搞明白了。

LinQ to SQL:這個(gè)由于只限制SQL Server數(shù)據(jù)庫(kù),所以目前已經(jīng)被LinQ to Entity逐漸取代。

(2)LinQ技術(shù)如何開(kāi)發(fā)實(shí)現(xiàn)?

LinQ表達(dá)式:與我們查詢(xún)數(shù)據(jù)需要編寫(xiě)SQL語(yǔ)句一樣,是使用它自然需要一個(gè)”語(yǔ)句“,就是linq表達(dá)式,而且同sql語(yǔ)句一樣也有它自己的語(yǔ)法規(guī)則。它也有與SQL語(yǔ)句中類(lèi)似的一些關(guān)鍵字:select where orderby 已經(jīng)groupby在語(yǔ)法上面也很相似。一會(huì)兒在我自己的驗(yàn)證實(shí)例中,會(huì)對(duì)這個(gè)做一個(gè)例子說(shuō)明。

LinQ表達(dá)式返回值必須是一個(gè)實(shí)現(xiàn)了IEnumerable<T>的迭代對(duì)象。

對(duì)迭代對(duì)象進(jìn)行枚舉時(shí),linq執(zhí)行它的工作。

(3)關(guān)于linQ的延遲執(zhí)行:linQ表達(dá)式中關(guān)于執(zhí)行返回的過(guò)程,書(shū)中描述的延遲執(zhí)行的特點(diǎn),只是說(shuō)了可能根據(jù)解析類(lèi)型的不同,linQ可能是一次執(zhí)行完也可以是在進(jìn)行迭代的過(guò)程中逐步執(zhí)行。但是還是對(duì)這個(gè)概念很模糊,這是我的第二個(gè)疑問(wèn),還需要深入學(xué)習(xí)的時(shí)候回顧。

(4)LinQ表達(dá)式的幾大核心特點(diǎn):為了更易于理解以下的部分將會(huì)以自己之后的程序驗(yàn)證來(lái)舉例講解其中的特點(diǎn)

我先定義了數(shù)據(jù)類(lèi):


//定義數(shù)據(jù)類(lèi)
    public class mytestData {        public int studentid { set; get; }//list綁定GridView列表屬性不能為只讀否則報(bào)錯(cuò)。        public string name { set; get; }        public int age{set;get;}        public mytestData(int id, string name, int age)
        {            this.studentid = id;            this.name = name;            this.age = age;
        }
       
    }


在頁(yè)面page_load中初始化測(cè)試數(shù)據(jù),原本想了想既然是查詢(xún)對(duì)象數(shù)據(jù)集合,那就定義一個(gè)ArrayList裝載自己的定義的數(shù)據(jù)類(lèi),在編寫(xiě)LinQ表達(dá)式的時(shí)候發(fā)現(xiàn)了一個(gè)問(wèn)題:

自定義的數(shù)據(jù)類(lèi)容器需要有查詢(xún)模式的實(shí)現(xiàn),所以也就是說(shuō)LinQ是支持一部分?jǐn)?shù)據(jù)類(lèi)型的查詢(xún)。。。。

 解決辦法就是采用List類(lèi)型:


  List<mytestData> mydata = new List<mytestData>();


先來(lái)看一個(gè)linq表達(dá)式的簡(jiǎn)單例子:


 protected void Page_Load(object sender, EventArgs e)
        {            //定義測(cè)試驗(yàn)證數(shù)據(jù)
            List<mytestData> mydata = new List<mytestData>();
            mydata.Add(new mytestData(1, "george", 23));
            mydata.Add(new mytestData(2, "lio", 25));
            mydata.Add(new mytestData(3, "kaiwen", 20));
            mydata.Add(new mytestData(4, "anna", 19));
            mydata.Add(new mytestData(5, "angel", 16));
            mydata.Add(new mytestData(6, "geo", 27));
            mydata.Add(new mytestData(7, "demo", 30));
            mydata.Add(new mytestData(8, "哈哈", 22));            //1.最簡(jiǎn)單的實(shí)現(xiàn)linq表達(dá)式
            IEnumerable<mytestData> matchs;
            matchs = from student in mydata  //student是查詢(xún)mydata集合中的對(duì)象的假名
                     where student.age>20    //查詢(xún)過(guò)濾條件
                     select student;         //查詢(xún)返回滿足過(guò)濾條件的matchs的集合            //頁(yè)面綁定數(shù)據(jù)展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
        }


調(diào)試查看返回的匹配的數(shù)據(jù)類(lèi)型:

頁(yè)面效果:

 

剛才我們對(duì)LinQ表達(dá)式應(yīng)該有了初步的認(rèn)識(shí),現(xiàn)在在結(jié)合一些例子說(shuō)明linQ表達(dá)式能夠?qū)崿F(xiàn)的幾個(gè)效果:

投影:其實(shí)簡(jiǎn)單的說(shuō)就是select語(yǔ)句支持一些數(shù)據(jù)類(lèi)型和字符串?dāng)?shù)據(jù)操作,甚至可以動(dòng)態(tài)定義一個(gè)新類(lèi)返回信息,跟我們之前的sql語(yǔ)句中select語(yǔ)句有一部分類(lèi)似,linQ表達(dá)式可以將查詢(xún)返回的數(shù)據(jù),支持一些操作返回為我們預(yù)期的類(lèi)型,字符串或是動(dòng)態(tài)新建的類(lèi)。

   但是對(duì)于一般值類(lèi)型操作和自定義返回對(duì)象的投影在表達(dá)式上還是存在一些差別,現(xiàn)在一個(gè)例子做一個(gè)演示:


            //2、投影--值類(lèi)型            //注意:這里的IEnumerable<string>中已經(jīng)將matchs申明為了string類(lèi)型,說(shuō)明返回的是string的迭代對(duì)象
            IEnumerable<string> matchs;
            matchs = from student in mydata  //student是查詢(xún)mydata集合中的對(duì)象的假名
                     where student.age > 20    //查詢(xún)過(guò)濾條件
                     select student.name + "添加的字符";        //查詢(xún)返回滿足過(guò)濾條件的matchs的集合            //頁(yè)面綁定數(shù)據(jù)展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();



            //2、投影--對(duì)象類(lèi)型            //注意:這里的IEnumerable<string>中已經(jīng)將matchs申明為了string類(lèi)型,說(shuō)明返回的是string的迭代對(duì)象            //IEnumerable<string> matchs;
            var matchs = from student in mydata  //student是查詢(xún)mydata集合中的對(duì)象的假名
                         where student.age > 20    //查詢(xún)過(guò)濾條件                         //這里的new{}是隱式創(chuàng)建的類(lèi)對(duì)象,沒(méi)有既定的類(lèi)型,所以無(wú)法通過(guò)IEnumerable<類(lèi)別名> matchs                         //來(lái)匹配返回的迭代類(lèi)對(duì)象,但是可以通過(guò)Var或者在先定義預(yù)期返回對(duì)象的類(lèi)型
                         select new { id=student.studentid,name=student.name,age=student.age};        
            //頁(yè)面綁定數(shù)據(jù)展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();


過(guò)濾和排序:比較有特色的一點(diǎn)就是where語(yǔ)句中可以同SQL語(yǔ)法中的邏輯表達(dá)式和多個(gè)條件表達(dá)式都適用,最特別的是由于是在C#源代碼環(huán)境中所以我們可以調(diào)用自己自定一的方法如 where myfunction(類(lèi)對(duì)象屬性值)


            //3 過(guò)濾和排序
            IEnumerable<mytestData> matchs;
            matchs = from student in mydata  //student是查詢(xún)mydata集合中的對(duì)象的假名
                     where student.age > 20    //查詢(xún)過(guò)濾條件 
                     orderby student.age   //排序
                     select student;                     
            //頁(yè)面綁定數(shù)據(jù)展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();

分組和聚合:如果對(duì)返回?cái)?shù)據(jù)進(jìn)行分組則返回的是分組對(duì)象的IEnumerable<T>集合,每個(gè)組實(shí)現(xiàn)IGrouping<T,k>接口,首先我們需要確定分組條件,其次需要確定每個(gè)組需要返回什么信息。


             //3 分組和聚合
            var matchs = from student in mydata  //student是查詢(xún)mydata集合中的對(duì)象的假名
                         where student.age > 20    //查詢(xún)過(guò)濾條件 
                         orderby student.age   //排序
                         group student by student.age into g //g是一個(gè)迭代IGouping<T,K>對(duì)象,每個(gè)組又是IEnumerable<mytestData>對(duì)象
                         select new { age = g.Key, avergeage = g.Average(student => student.age) };                     
            //頁(yè)面綁定數(shù)據(jù)展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)