LINQ学习经验总结
类型:数据库类大小:1.7M语言:英语评分:5.0标签:立即下载。2009年已经学过Linq了,被她漂亮的语法吸引,但是现在我的公司还在使用VS2005的框架下。Net2.0,所以Linq已经很久没有使用了。最近部门的同事对此很感兴趣,所以打算整理一些东西和大家分享。LINQ是语言集成查询的缩写,这是集成在中的一个功能。NET编程语言。它已经成为编程语言不可或缺的一部分,可以获得强类型语言的好处,如编译时良好的语法检查、丰富的元数据、智能感知、静态类型等。同时,它使查询内存中的信息变得容易,而不仅仅是外部数据源。Linq包括Linq to Objects、Linq to SQL、linq to XML、Linq to数据集等。本文从Linq to Objects开始,了解Linq的皮毛。在启动Linq之前需要了解的扩展方法,顾名思义,就是扩展现有类的方法。扩展方法可以向现有类添加一个公共接口(不是C#中的接口),而无需修改它们。扩展方法本质上是一个静态方法,只是它的第一个参数必须用这个关键字声明,第一个参数的类型就是要扩展的类型。例如公共静态double to double(此字符串源){ double RES=0d双倍。TryParse(来源,外部资源);返回res} public static void SimpleExtesionMethod(){ double d=' 12345.54321 '。to double();控制台。write line(d);}这是将字符串转换为双精度类型的简单扩展方法。只要引用了此方法的命名空间,ToDouble方法就可以用字符串类型直接调用。扩展方法是后面的基础,C#3.0中Linq的实现就是基于扩展方法。Linq的相关功能是通过扩展IEnumerable接口(Linq to Objects)和IQueryable来实现的,Linq的相关关键字最终转化为对IEnumerable(IQueryable)的调用。Lambda表达式lambda表达式实际上是。net2.0,然后在3.0中以更优雅的方式呈现。lambda表达式的基本语法是(参数列表)={语句块;}或(参数列表)=表达式当参数列表中只有一个参数时,括号中可以省略Funcstring,string func=x=x x控制台。write line(func(' a '));Var:隐式类型变量使用编译器可以导出的变量声明,而不需要显式指定对象的类型。Var容器=新列表{ '张三','李四','王五' };IEnumerable查询=从容器中的名称选择名称;在上面的例子中,由于对象类型已经在定义中指明,所以完全没有必要在声明中使用显示的类型定义,所以可以使用var关键字。对于匿名对象,vartest=new {name=' sth '。类型='未知' };因为匿名对象不能用类型类声明,所以此时可以用var声明。注意var只是省略了显式声明的过程,C#本身是静态语言,所以var声明的变量类型已经确定,不能更改,也就是说var不是变体类型。Linq应用Linq语法的对象是System.Linq下的可枚举类支持的,通过观察他的签名,你会发现他已经为IEnumerable实现了一系列的扩展方法,也就是说任何实现IEnumerable的对象都可以使用Linq语法进行查询。对于只实现IEnumerable接口而不实现IEnumerable的对象,它们可以传递公共静态IEnumerable转换(这个IEnumerable源)。将IEnumerable接口转换为IEnumerable(例如,数组列表)。在C#3.0中,Linq中的关键字为Linq引入了一些新的关键字,它们是:从联接where组到let order by select。熟悉Sql的学生看起来眼熟吗?事实上,它们在Linq中的含义与在SQL中的含义相似,所以它们会很容易理解。下面时间,简单介绍一下这些关键词的用法。
fromfrom子句是Linq查询的开头,任何Linq语句都以from开头。from子句指定查询的容器和在此语句中有效的局部变量(用于指定容器中的一个项,from子句的效果类似于foreach)。from子句的语法是containerlocal中的from local,这是此Linq语句中的一个局部变量。因为容器必须是IEnumerable,所以它的类型可以从容器(即t)中推导出来。上一段简单的例子:var容器=new List { '张三','李四','王五' };var查询=从容器中的名称选择名称;foreach(查询中的字符串名称){Console。WriteLine(名称);}输出张吴如果容器只实现IEnumerable而不实现IEnumerable,则需要显式指定局部变量的类型,或者使用Cast转换为ienumerablevar容器=new ArrayList { '张三','李四','王五' };var查询=来自容器中的名称。Cast()选择名称;//或varquery1=从容器中的字符串名称中选择名称;Select投射查询的结果,并指定要在子句中选择的列。例如,有时我们只需要投影某一列。我们可以这样做:private static void testselectsingproperty(){ var persons=getpersons();风险值查询=从个人中选择个人名称;foreach(查询中的var项目){Console。WriteLine(项);}}我们还可以指定要投影的列集。此时,我们需要匿名类型varquery=从p persons中选择new {p.id,p . name };foreach(查询中的var项目){Console。WriteLine('No:{0},Name:{1} ',item。标识,项目。名称);}查询中的每一项始终是一个具有ID属性和Name属性的对象。当然,有时候实体的属性名并不是我们想要的或者是从属性中计算出来的,所以我们可以显式指定属性名,如下:var query=from p in persons select new { userid=p . id,friend name=p.gender==' male '?先生' : '女士' p .姓名};foreach(查询中的var项目){Console。WriteLine('No:{0},友好名称:{1} ',项目。用户标识,项目。FriendName);}其中过滤容器中的数据。var查询=来自p in persons where p . department id==1 select p . Name;Join类似于SQL中的join,Linq中的join子句用于将两个容器的数据以某种关系进行关联。var departments=GetDepartments();var persons=GetPersonsvar查询=从部门中的d开始在d.ID等于p . department的人员中加入p选择新的{ d,p };值得注意的是,join子句只能使用equals或not equal,不能使用其他运算符(==两者都不能)。等号运算符必须连接在左边,右边是右边,不能交换,否则编译无法通过。into to子句用于进一步保存join或group子句的结果,并将其包装到系统中。linq.igoroupingkey、telegram对象和igrouping继承自IEnumerable。可以看到,igrouping接口提供了分组键和包含在这个键下的集合。
例如,请参见根据指定条件对结果进行分组。Var container=新列表{ '张山','李思','吴王','赵丽','邓' };var query=从containergroup中的名称按名称排序。长度为g选择新的{ g.Key,Values=g };该示例演示了按名称长度对名称列表进行分组,并将分组结果保存在本地变量g中。查询结果可以输出到foreach(查询中的var组){console。writeline ('{0} : ',group.key );foreach(组中的var项目。值){控制台。WriteLine(项);}} letlet子句用于向查询中添加一个新的局部变量,以便在下面的查询中可以看到。var query=from p in persons let友好名称=p .性别=='男'?Mr ' : ' Ms ' p选择新的{UserID=p.ID,FriendName=friendly name };foreach(查询中的var项目){Console。WriteLine('No:{0},友好名称:{1} ',项目。用户标识,项目。FriendName);}其他扩展名在IEnumerable上Take Skip用于选择第一个xx或跳过第一个XX。如果选择11号到20号,可以查询。跳过(10)。以(10)为例。order by order by降序排序查询。OrderBy(c=c .长度);你已经看到了所有这些词,即取不重复、联合、交集和差异(这似乎可以通过看参数来理解)。其他扩展属于可枚举类。Linq的延迟加载特性。Linq查询的结果是IEnumerable。对于IEnumerable,C#通过yield关键字实现迭代器,达到延迟加载的目的。因此,Linq查询将只在需要时执行。但是有些扩展方法在执行时会尝试遍历整个容器,使得延迟加载无效,比如排序、聚合函数(Count、Sum、Average等)。).)static IEnumerable InfinityInts(){ int count=0;而(真)收益返回计数;} public static void lazy load(){ var query=from I in InfinityInts()select I;foreach(查询中的var i。采取(20)){控制台。write line(I);} } public static void cantdolaziload(){ var query=from I in InfinityInts()select I;foreach(查询中的var i。OrderBy(i=i)。采取(20)){控制台。write line(I);}}这里有一个简单的例子来证明,当使用Take时,Linq语句可以正常执行,但是当我们在Linq上再次使用一个Order By时,程序就卡住了。当然,这是有道理的。失去延迟加载功能后,尝试对无限序列进行排序的结果必须是outOfMemory。
最后的
这些都是表面的。感兴趣的学生可以去MSDN了解更多详细信息。最后推荐一个工具和一个网站。
临朐(http://www。Linqpad.net/)是一个非常有用的临朐学习工具
Linq 101微软官方Linq示例代码
版权声明:LINQ学习经验总结是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。