Csharp/C#教程:详解LINQ入门(上篇)分享

前言

最近和我们老大一起做技术面试(我是旁听的),发现前来面试的没几个掌握甚至是丁点了解LINQ。这让我很纳闷,LINQ伴随2008一起发布至今难道大家真的没时间去了解一下或者学习一下这个应用基础吗。甚至问及有些人LINQ是什么,答题者想都不想LINQTOSQL,崩溃!没错,LINQ是可以TOSQL,但是除了SQL,LINQ就无所作为了?非也。因此在这里和大家一起分享学习LINQ。本文适合以下读者,如果你是不符合者请赏脸捧个场,3Q

从未触碰过LINQ的 对LINQ有过了解但是从未实战过的 打算学习LINQ的

简介

LINQ是什么?引用官方术语“语言集成查询(LINQ)是VisualStudio2008和.NETwork3.5版中引入的一项创新功能,它在对象领域和数据领域之间架起了一座桥梁。”那么LINQ给我们带来了什么,请看以下例子:

问:有序列A=int[]{1,2,3,4,5,6,7,8,0};B=int[]{2,4,7,8,9}。请求出包含A和B共同值的序列C。

如果按照原来的思路,那么编码也许如下:

说明: 

List<int>c=newList<int>(); foreach(intainA){ foreach(intbinb){ if(a==b){ c.add(a); } } }

说明: 

是不是觉得上面这段虽然没什么问题,但是很丑陋。如果我们引用LINQ来编写呢:

IEnumerable<int>C=fromainA frombinB wherea==b selecta;

语法

  1.LINQ所处在的主要命名空间:System.Linq

  2.LINQ的处理的核心对象就是IEnumerable可枚举对象也包括了泛型枚举,换句话说当你要处理的对象为IEnumerable类型对象时即可使用LINQ操作它。且在没有经过其他处理的情况下将返回一个新的IEnumerable序列,注意LINQ有一个特性“延迟加载”这个将在后续说明。

     3.关键字(摘自MSDN):  

    from:     指定数据源和范围变量(类似于迭代变量)。

    where:    根据一个或多个由逻辑“与”和逻辑“或”运算符(&&或||)分隔的布尔表达式筛选源元素。

    select:   指定当执行查询时返回的序列中的元素将具有的类型和形式。

    group:   按照指定的键值对查询结果进行分组。

    into:      提供一个标识符,它可以充当对join、group或select子句的结果的引用。

    orderby:基于元素类型的默认比较器按升序或降序对查询结果进行排序。

    join:      基于两个指定匹配条件之间的相等比较来联接两个数据源。

    let:        引入一个用于存储查询表达式中的子表达式结果的范围变量。

    in:         join子句中的上下文关键字。

    on:        join子句中的上下文关键字。

    equals:  join子句中的上下文关键字。

    by:        group子句中的上下文关键字。

    ascending:orderby子句中的上下文关键字。

    descending:orderby子句中的上下文关键字。

  4.语法说明,每个LINQ语句都以from作为开头,以select作为结束,这点和T-SQL语法不通的切记先入为主的思考。其他关键字如where则类似T-SQL作为筛选判断条件。

样例:IEnumerable<T>nums=fromninnumswhere….orderby…select….

扩展

从.net3.0开始MS就给我们引进了其他一些新的特性,由于篇幅关系在这里给大家简单的介绍几个LINQ常用到的特性:

  1.关键字var:

    指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型或.NETFramework类库中定义的类型。这样我们就可以在上述的LINQ表达式中例如可简写为:varnums=fromninnumswhere….orderby…select….

  2.匿名类型:  

    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。例如:varobj=new{A=”a”,B=”b”};而LINQ则可以为varnums=fromobjinobjsselectnew{obj.A,obj.B}

案例

普通查询

varquery=fromnuminnum selectnum.ProperyA

筛选查询

varquery=fromobjinobjs whereobj.ProperyA>Condition selectobj

分组查询

varquery=fromobjinobjs groupobjbyobj.PropertyAintog orderbyg.Key selectg;

注意,在此示例里,关键字into不是必须的,使用into时,必须继续编写该查询,并最终用一个select语句或另一个group子句结束该查询。

内联查询

varquery=fromobj1inobjs1 joinobj2inobjs2onobj1.IDequalsobj2.ID selectnew{A=obj1.Property,B=obj2.Property};

左外联查询

varquery=fromobj1inobjs1 joinobj2inobjs2onobj1.IDequalsobj2.Obj1IDintog fromsubpeting.DefaultIfEmpty() selectnew{P1=obj1.P1,P2=(subpet==null?null:subpet.P2)};

注意,此处涉及到.net3.5新特性静态扩展方法(后续介绍不影响理解)DefaultIfEmpty():如果序列为空,则返回一个具有默认值的单一实例集合

您可能感兴趣的文章:详解LINQ入门(中篇)详解LINQ入门(下篇)

标签: IN

详解LINQ入门(中篇)

dotnet core链接mongodb代码实例

上述就是C#学习教程:详解LINQ入门(上篇)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/903977.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐