LINQ簡介
一、什么是LINQ
長期以來,開發社區形成以下的格局:
1、面向對象與數據訪問兩個領域長期分裂,各自為政。
2、編程語言中的數據類型與數據庫中的數據類型形成兩套不同的體系,例如:
C#中字符串用string數據類型表示。
SQL中字符串用NVarchar/Varchar/Char數據類型表示。
3、SQL編碼體驗落后
沒有智能感知效果。
沒有嚴格意義上的強類型和類型檢查。
4、SQL和XML都有各自的查詢語言,而對象沒有自己的查詢語言。
上面描述的問題,都可以使用LINQ解決,那么究竟什么是LINQ呢?
LINQ(Language Integrated Query)即語言集成查詢。
LINQ是一組語言特性和API,使得你可以使用統一的方式編寫各種查詢,它在對象領域和數據領域之間架起了一座橋梁。用於保存和檢索來自不同數據源的數據,從而消除了編程語言和數據庫之間的不匹配,以及為不同類型的數據源提供單個查詢接口。
LINQ總是使用對象,因此你可以使用相同的查詢語法來查詢和轉換XML、對象集合、SQL數據庫、ADO.NET數據集以及任何其他可用的LINQ提供程序格式的數據。
LINQ主要包含以下三部分:
1、LINQ to Objects 主要負責對象的查詢。
2、LINQ to XML 主要負責XML的查詢。
3、LINQ to ADO.NET 主要負責數據庫的查詢。
LINQ to SQL
LINQ to DataSet
LINQ to Entities
二、LINQ的優勢
1、熟悉的語言:開發人員不必為每種類型的數據源或數據格式學習新的語言。
2、更少的編碼:相比較傳統的方式,LINQ減少了要編寫的代碼量。
3、可讀性強:LINQ增加了代碼的可讀性,因此其他開發人員可以很輕松地理解和維護。
4、標准化的查詢方式:可以使用相同的LINQ語法查詢多個數據源。
5、類型檢查:程序會在編譯的時候提供類型檢查。
6、智能感知提示:LINQ為通用集合提供智能感知提示。
7、整形數據:LINQ可以檢索不同形狀的數據。
三、LINQ的操作步驟
所有的Linq查詢操作都由以下三個不同的操作組成:
1.獲得數據源
想要使用Linq進行查詢,數據源必須支持IEnumerable或IEnumerable(T)泛型接口或派生接口(如泛型的IQueryable(T)接口)。
2.創建查詢
查詢指定要從數據源中檢索的信息
查詢還可以指定在返回這些信息之前如何對其進行排序、分組和結構化
查詢存儲在查詢變量中,並用查詢表達式進行初始化。為使編寫查詢的工作更加容易,C#引入了新的查詢語法
3.執行查詢
查詢變量本身只是存儲查詢命令。實際的查詢執行會延遲在foreach語句中循環訪問變量時發生。此概念稱為“延遲執行”。
強制立即執行,可以通過以下兩個方法,使得Linq立即執行查詢
執行聚合函數(Count、Max、Average、First)。
調用ToList(<T>Source)或ToArray(<T>Source)方法緩存結果。
四、LINQ的案例
案例一:
學生類
//學生類 public class Student { private string name; private List<int> score; public string Name { get { return name; } set { name = value; } } public List<int> Score { get { return score; } set { score = value; } } }
數據查詢
//數據源 IList<Student> students = new List<Student> { new Student{ Name="Kevin", Score=new List<int>{89,93,88,78}}, new Student{ Name="Jackie",Score=new List<int>{92,87,83,91}}, new Student{ Name="Helen",Score=new List<int>{53,76,72,62}} }; //所有的Linq查詢操作都由以下三個不同的操作組成: //1.獲得數據源 //2.創建查詢 //3.執行查詢 //使用復合from子句查詢命令 var getStudent = from student in students from score in student.Score where score > 90 select new { Name = student.Name, Score = score }; foreach (var st in getStudent) { Console.WriteLine("NAME:{0},SCORE:{1}",st.Name,st.Score); }
結果:
我們可以看到學生對象中有個Score屬性,Score屬性本身就是List集合,這時候我們就要用到復合from子句進行查詢了。首先遍歷學生對象集合中的每個學生對象,然后在用另一個from子句,對每個學生對象中的Score屬性進行遍歷,篩選出含有90分以上的學生信息進行返回。
案例二:
namespace Demo { // 定義委托 delegate bool FindEven(int item); class IntExtension { public static int[] where(int[] array, FindEven dele) { int[] result = new int[5]; int i = 0; foreach (int item in array) { if (dele(item))//調用下面的 delegate (int item) { result[i] = item; i++; } } return result; } } class Program { static void Main(string[] args) { // 查詢出數組中的偶數並排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; //delegate(int item){return item % 2 == 0;}表示委托的實現 List<int> list = IntExtension.where(ints, delegate (int item) { return item % 2 == 0; //return item % 2 != 0; 奇數 }).ToList(); // 正序排序 list.Sort(); // 反轉 list.Reverse(); // 輸出 Console.WriteLine(string.Join(",", list)); Console.ReadKey(); } } }
結果:
通過泛型委托實現對Int數組ints實現偶數輸出並排序;