• 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():用于取消长时间运行的任务

                  学以致用,慢慢进步

  • 相关阅读:
    MyEclipse中配置Hibernate
    struts2_对Map进行双层迭代
    Hibernate关联关系全集
    CodeIgniter+Smarty配置
    去掉php框架CI默认url中的index.php【整理】
    jquery的show方法是display:block还是display:inline呢?
    Codeigniter中的Error【转】
    去除 inlineblock 空隙终极解决方案
    jquery三级折叠菜单
    css实现页面文字不换行、自动换行、强制换行
  • 原文地址:https://www.cnblogs.com/fengxiaojiu/p/11953016.html
Copyright © 2020-2023  润新知