最近做數據查詢,發現linq 真的比我 印象中 要強大的多,實用的多,所以 我決定 要與linq 來一場 深入交流,
因為linq的基礎用法 可以百度一大摞,我就記錄點不一樣的,結合我做項目使用的。
什么是linq?
linq(Language Integrated Query, 語言集成查詢)
優點:1)linq提供了不同數據源的抽象層,所以可以使用相同的語法訪問不同的數據源
2)linq在一定程度上降低了訪問數據的復雜度(對於這點深有感觸)
3)linq在編譯的時候就進行檢查,而不是在運行時。這樣 語法錯誤可以及時修正
4)linq 定義的查詢表達式 不是立即執行的,是在迭代中執行的(當然有擴展方法可以讓其立即執行)。
這樣 我們就可以把復雜的查詢語句分開,而不用擔心查詢的效率。
缺點:1)linq 是語法糖,最終還是會轉化為sql 語句 ,這點會影響一點點性能,一般情況下 可忽略
2)linq對 幾百行的sql 無能為力,對於上百萬的 數據 就歇菜了
3)linq使用的多了,容易讓程序員“忘本”,不在關心SQL語句怎么寫的。
linq 的 功能(記錄部分):
1、篩選、索引篩選 、類型篩選
//簡單的篩選就是where,這里就不做記錄
//這里舉例 索引篩選 //說明:在Where()方法的重載中,可以傳遞第二個參數-索引。索引是篩選器返回的每個結果的計數器。 //並且可以在表達式中使用這個索引,執行基於索引的計算。 //使用索引返回姓氏J開頭、索引為偶數的 名字 var nameList = new List<string> { "Nice", "Juer", "Jerry", "Kerry", "Amber", "Iort" }; var result = nameList.Where((r, index) => r.StartsWith("J") && index % 2 == 0); foreach (var item in result) { Console.WriteLine(item); }
輸出結果:Jerry
//基於類型篩選 OfType() object[] data = { "Kerry",123,"Ambin",8,9}; var query = data.OfType<string>(); foreach (var item in query) { Console.WriteLine(item); }
//輸出結果:Kerry Ambin
2、復合的from子句
//復合的from子句 說明 student是一個類,這個類中有一個對象grade var data = from r in stuednt from c in r.grade select r;
3、排序、分組、聚合操作(這個案例來源於項目需求)
//需求:查詢一張表中,以發票種類(4種)和異常狀態(5種) 作為一組, //分析每種可能性的 各個發票種類和各個異常狀態下的總張數 //結果展示 總共有20種 //排序(orderby)、分組(group by) //說明:fapList:發票表信息 AbnormalReason和InvoiceType 都是自己定義的枚舉 var data = from a in fapList where a.Yiczt != AbnormalReason.All && (a.Fapzl == InvoiceType.VatOrdinary || group a by new { a.Fapzl, a.Yiczt } into g orderby g.Key.Fapzl select new { g.Key.Yiczt, g.Key.Fapzl, Shuie = g.Sum(u => u.Shuie), jine = g.Sum(u => u.Jine), zhuangyfpCount = g.Count(u => u.Fapzl == InvoiceType.VatSpecial), putfpCount = g.Count(u => u.Fapzl == InvoiceType.VatOrdinary), dianzfpCount = g.Count(u => u.Fapzl == InvoiceType.VatElectronicOrdinary), jidcfpCount = g.Count(u => u.Fapzl == InvoiceType.VatMotorSpecial), toatlCount = g.Count() };
4、對嵌套的對象分組
///對嵌套的對象分組 ///說明:query:表一數據 query2:表二數據 表一的id對應表二的Fapid 表一和表二的關系:一對多 ///需求:將表二中對應表一記錄的 最新一條記錄 組合到表一中並展示出來 var result = from r in query select new { r.Faphm, r.Fapzl, r.Fapdm, r.Id, chayjlist = (from t in query2 where t.Lslx == HistoryType.Check && t.Fapid == r.Id orderby t.CreationTime descending select new { t.Chaycg, t.Jiegms, t.Jiegnr, t.Chaycs, t.CreationTime }).Take(1) };
5、內連接、左外連接、組連接
//左外連接:返回左邊序列的全部數據(內連接在此不舉列子,組連接用得少,也不在此舉列子,以后有時間在專門記錄) var str = from r in query1 join t in query2 on r.Id equals t.Fapid into rt from t in rt.DefaultIfEmpty() select new { r.Fapdm, r.Faphm };
6、集合操作:Distinct()、Union()、Intersect()、Except()
參考這個:https://www.cnblogs.com/fengxiaojiu/p/7886885.html
7、合並
Zip() 方法允許用一個謂詞函數將兩個線管的序列合並為一個。
8、並行LINQ
AsParallel(): 處理大數據 大型集合 會占用多個CPU
9、取消
WithCancellation():用於取消長時間運行的任務
學以致用,慢慢進步
