c#、ASP.NET core 基礎模塊之一:linq(原創)


最近做數據查詢,發現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():用於取消長時間運行的任務

              學以致用,慢慢進步


免責聲明!

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



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