程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Linq學習-初見篇讀後總結,linq初見讀後總結

Linq學習-初見篇讀後總結,linq初見讀後總結

編輯:C#入門知識

Linq學習-初見篇讀後總結,linq初見讀後總結


 

   今天將之前買的《ASP.NET高級程序設計第四版》拿出來翻看了一下,其中第十三章節關於linq技術的講解,還不錯,之前自己對於這一塊屬於只聞其名不知其理,所以為了保持自己學海無涯苦作舟的心態,將自己今天學習的內容總結分享出來,對於跟我一樣需要接觸學習linq的朋友們也能夠提供一些幫助。

   (1)什麼是linq技術?

     這個是在《ASP.NET高級程序設計第四版》第一章節中講解asp.net版本中有關於該技術的起源背景,linq是asp.net 3.5 中跟AJAX一起在原來2.0版本上引入的一項新技術。

     接下來是13章節中的一些知識點結合我自己的理解,其中我自己也存在兩點疑惑,如果有精通的希望能指導一番,哈哈,進入正題:

     linq:縮寫是language integrated query 語言集成查詢,是一項操作內存數據的技術,看完一個小節,感覺跟sql查詢的區別就是它可以將一些數據類對象執行查詢過濾,返回自己請求的數據,也即是說它既可以實現c#源代碼環境中的對象數據查詢,也可以實現關系數據庫數據訪問。

    linq技術為我們開發人員提供了五個比較實用的數據訪問類型:

  • LinQ to Object:可以允許對內存中的類對象查詢。
  • LinQ to DataSet:可以對內存中的DataSet緩存數據,執行數據訪問。
  • LinQ to xml :針對XML數據的一種解析封裝可以實現傳統xml解析效果。
  • LinQ to Entity:這是目前linq技術比較流行的一個亮點了,它提供了對關系數據庫的數據訪問,可以使得開發者不必通過編寫負責ADO.NET的數據訪問層就可以實現數據庫訪問,也可以兩者一起結合使。LinQ相對ADO.NET的優勢在哪裡呢?它真的有ADO.NET如此強大的數據訪問功能呢?這是我今天的第一個疑問,或許還需要後面的學習才能搞明白了。
  • LinQ to SQL:這個由於只限制SQL Server數據庫,所以目前已經被LinQ to Entity逐漸取代。

 (2)LinQ技術如何開發實現?

  • LinQ表達式:與我們查詢數據需要編寫SQL語句一樣,是使用它自然需要一個”語句“,就是linq表達式,而且同sql語句一樣也有它自己的語法規則。它也有與SQL語句中類似的一些關鍵字:select where orderby 已經groupby在語法上面也很相似。一會兒在我自己的驗證實例中,會對這個做一個例子說明。
  • LinQ表達式返回值必須是一個實現了IEnumerable<T>的迭代對象。
  • 對迭代對象進行枚舉時,linq執行它的工作。

  (3)關於linQ的延遲執行:linQ表達式中關於執行返回的過程,書中描述的延遲執行的特點,只是說了可能根據解析類型的不同,linQ可能是一次執行完也可以是在進行迭代的過程中逐步執行。但是還是對這個概念很模糊,這是我的第二個疑問,還需要深入學習的時候回顧。

  (4)LinQ表達式的幾大核心特點:為了更易於理解以下的部分將會以自己之後的程序驗證來舉例講解其中的特點

     我先定義了數據類:

復制代碼
//定義數據類
    public class mytestData {
        public int studentid { set; get; }//list綁定GridView列表屬性不能為只讀否則報錯。
        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;
        }
       
    }
復制代碼

 

 在頁面page_load中初始化測試數據,原本想了想既然是查詢對象數據集合,那就定義一個ArrayList裝載自己的定義的數據類,在編寫LinQ表達式的時候發現了一個問題:

自定義的數據類容器需要有查詢模式的實現,所以也就是說LinQ是支持一部分數據類型的查詢。。。。

      

   解決辦法就是采用List類型:

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

  先來看一個linq表達式的簡單例子:

復制代碼
 protected void Page_Load(object sender, EventArgs e)
        {
            //定義測試驗證數據
            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.最簡單的實現linq表達式
            IEnumerable<mytestData> matchs;
            matchs = from student in mydata  //student是查詢mydata集合中的對象的假名
                     where student.age>20    //查詢過濾條件
                     select student;         //查詢返回滿足過濾條件的matchs的集合
            //頁面綁定數據展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
        }
復制代碼

 調試查看返回的匹配的數據類型:

 

  頁面效果:

  

  剛才我們對LinQ表達式應該有了初步的認識,現在在結合一些例子說明linQ表達式能夠實現的幾個效果:

  •  投影:其實簡單的說就是select語句支持一些數據類型和字符串數據操作,甚至可以動態定義一個新類返回信息,跟我們之前的sql語句中select語句有一部分類似,linQ表達式可以將查詢返回的數據,支持一些操作返回為我們預期的類型,字符串或是動態新建的類。

         但是對於一般值類型操作和自定義返回對象的投影在表達式上還是存在一些差別,現在一個例子做一個演示:

復制代碼
            //2、投影--值類型
            //注意:這裡的IEnumerable<string>中已經將matchs申明為了string類型,說明返回的是string的迭代對象
            IEnumerable<string> matchs;
            matchs = from student in mydata  //student是查詢mydata集合中的對象的假名
                     where student.age > 20    //查詢過濾條件
                     select student.name + "添加的字符";        //查詢返回滿足過濾條件的matchs的集合
            //頁面綁定數據展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
復制代碼 復制代碼
            //2、投影--對象類型
            //注意:這裡的IEnumerable<string>中已經將matchs申明為了string類型,說明返回的是string的迭代對象
            //IEnumerable<string> matchs;
            var matchs = from student in mydata  //student是查詢mydata集合中的對象的假名
                         where student.age > 20    //查詢過濾條件
                         //這裡的new{}是隱式創建的類對象,沒有既定的類型,所以無法通過IEnumerable<類別名> matchs
                         //來匹配返回的迭代類對象,但是可以通過Var或者在先定義預期返回對象的類型
                         select new { id=student.studentid,name=student.name,age=student.age};        
            //頁面綁定數據展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
復制代碼
  • 過濾和排序:比較有特色的一點就是where語句中可以同SQL語法中的邏輯表達式和多個條件表達式都適用,最特別的是由於是在C#源代碼環境中所以我們可以調用自己自定一的方法如 where myfunction(類對象屬性值)
復制代碼
            //3 過濾和排序
            IEnumerable<mytestData> matchs;
            matchs = from student in mydata  //student是查詢mydata集合中的對象的假名
                     where student.age > 20    //查詢過濾條件 
                     orderby student.age   //排序
                     select student;
                     
            //頁面綁定數據展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
復制代碼
  • 分組和聚合:如果對返回數據進行分組則返回的是分組對象的IEnumerable<T>集合,每個組實現IGrouping<T,k>接口,首先我們需要確定分組條件,其次需要確定每個組需要返回什麼信息。
復制代碼
             //3 分組和聚合
            var matchs = from student in mydata  //student是查詢mydata集合中的對象的假名
                         where student.age > 20    //查詢過濾條件 
                         orderby student.age   //排序
                         group student by student.age into g //g是一個迭代IGouping<T,K>對象,每個組又是IEnumerable<mytestData>對象
                         select new { age = g.Key, avergeage = g.Average(student => student.age) };
                     
            //頁面綁定數據展示
            GridView1.DataSource = matchs;
            GridView1.DataBind();
復制代碼

最後的效果圖:

 不知不覺都三個小時了,太晚了,今天就總結到這裡。。。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved