LINQ語法一


 LINQ即語言集成查詢,是.NET Framework 3.5中新增的功能。其功能類似於數據庫中的SQL語句(實際上LINQ就是針對.NET Framework的SQL):提供標准的、易於學習的查詢和更新數據模式。
從from開始
用過SQL的朋友都知道,最簡單的SQL語句SELECT record FROM tableName:獲取表中的所有記錄,那么對應於LINQ,其語法如下:
from record in tableName select record。
明顯的差異是將from語句放到了句首,此種語法方式只是為了適應Visual Studio中智能提示(試想如果將from子句放在后面,先輸入select語句,此時select的對象類型尚不確定,智能提示無法做出相應提示)
SQL語句是從數據庫表中查詢出記錄,而LINQ適應的數據源更廣,包括SQL Server數據庫、XML文檔、ADO.NET數據集以及所有支持IEnumerable及IEnumerable<T>接口的任意對象集合。
LINQ只是一種語法
LINQ查詢語句實際上和我們常用的foreach語句相似:中間語言(IL)中並沒有對應的foreach語句,編譯器最終會將foreach語句轉換為一些列的語句塊,例如:
隱藏行號 復制代碼 C#
  1. string[] strs = new String[] {"One","Two","Three" };
    
  2. foreach (String s in strs)
    
  3. {
    
  4.     Console.WriteLine(s);
    
  5. }
    

轉換為:

隱藏行號 復制代碼 C#
  1. string[] strs = new String[] {"One","Two","Three" };
    
  2. IEnumerator e = strs.GetEnumerator();
    
  3. while (e.MoveNext())
    
  4. {
    
  5.     Console.WriteLine(e.Current);
    
  6. }
    

 

在.NET Framework 3.5中為IEnumerable<T>接口加入了大量的擴展方法,這些方法為LINQ提供了實現基礎(就像IEnumerable中GetEnumerator方法為foreach提供實現基礎一樣)
例如,IEnumerable中的Where擴展方法,它和LINQ中的where子句對應,用於篩選數據:

隱藏行號 復制代碼 C#
  1. //使1用?Where方?法¨
    
  2.  IEnumerable<String> query = strs.Where(s => s.StartsWith("T"));
    
  3. foreach (String s in query)
    
  4. {
    
  5.     Console.WriteLine(s);
    
  6. }
    
  7. //使1用?query語?句?
    
  8. query = from s in strs
    
  9.         where s.StartsWith("T")
    
  10.         select s;
    
  11. foreach (String s in query)
    
  12. {
    
  13.     Console.WriteLine(s);
    
  14. }
    


題外話:如何為已知類型擴展方法:只需一個靜態類和靜態方法,在靜態方法中參數使用this關鍵字,以下為String類型新增一個AppendA方法:

隱藏行號 復制代碼 C#
  1. public static class Extension
    
  2. {
    
  3.     public static String AppendA(this String ins)
    
  4.     {
    
  5.         return ins + "AAA";
    
  6.     }
    
  7. }
    

 

var關鍵字與匿名類型
var關鍵字指示編譯器推斷出變量的類型,例如:
var s = "Hello";
編譯器最終將s變量推斷為String類型,即最終按
String s = "Hello";
來生成中間代碼
在LINQ中我們可以通過var關鍵字來聲明查詢對象,而無需清楚最終我們查詢返回的具體類型:

隱藏行號 復制代碼 C#
  1. var query = from s in strs
    
  2.         where s.StartsWith("T")
    
  3.         select s;
    


另一種情況,有時我們只需要返回對象的某些屬性,此時我們無需定義返回數據的類型,直接使用匿名類型:

1:  var xxx = new { F1 = "Hello", F2 = "Hello2" };
2:   

以下查詢只返回Programer類的Name和Position屬性:

隱藏行號 復制代碼 C#
  1. public class Programer
    
  2.     {
    
  3.         public String Name { get; set; }
    
  4.         public String Language { get; set; }
    
  5.         public String Position { get; set; }
    
  6.         public Programer()
    
  7.         {
    
  8.         }
    
  9.     }
    
隱藏行號 復制代碼 C#
  1. Programer[] ps = new Programer[] { 
    
  2.     new Programer(){ Name="張?三y", Language="C#", Position="Leader"},
    
  3.     new Programer(){ Name="李?四?", Language="C#", Position="Coder"},
    
  4.     new Programer(){ Name="王?五?", Language="Java", Position="Coder"}
    
  5. };
    
  6. var queryPs = from p in ps
    
  7.               where p.Language == "C#"
    
  8.               select new { Name = p.Name, Position = p.Position };
    
  9.            
    
  10. foreach (var p in queryPs)
    
  11. {
    
  12.     Console.WriteLine(String.Format("Name:{0}\t\tPosition:{1}", p.Name, p.Position));
    
  13. }
    

 

查詢的執行時間
上述例子中LINQ語句是在foreach語句時才真正執行的,定義時只是定義了查詢語句,在進入foreach枚舉時才真正執行查詢語句。如果我們在定義時需要立即返回查詢結果可以使用ToArray或ToList方法(這兩個方法也是在.Net Fromework 3.5中為IEnumerable接口新增的擴展方法)。

隱藏行號 復制代碼 C#
  1. var queryPs = (from p in ps
    
  2.               where p.Language == "C#"
    
  3.               select new { Name = p.Name, Position = p.Position }).ToArray();
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM