linq是什么呢?
LINQ,语言集成查询(Language Integrated Query),他提供N多查询方法,基本的是select(),where(),orderby()和groupby()这几种,是不是很熟悉,sql中不是也有吗?那么他们有什么区别吗?下面再说.
先从一个简单的实例上理解一下linq是如何使用的.
如实现这个功能:从 numbers 数组中提取偶数并降序排列
以前是这么做的
- int[]numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
- List<int>even = new List<int>();
- foreach(int number in numbers)
- {
- if (number % 2 == 0)
- {
- even.Add(number);
- }
- }
- even.Sort();
- even.Reverse();
用linq你就可以这样实现了,简洁了很多
- int[]numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
- var even= numbers
- .Where(p => p % 2 == 0)
- .Select(p => p)
- .OrderByDescending(p => p);
上面的那段代码解释就是,第一行就是new一个数组,并赋值。然后对于数组numbers进行where操作,要p%2==0也就是偶数,在这里p就是numbers数组中某一个数,如果是一个对象集合,那么p就是一个对象。select操作p=>p,就是返回整个p,这个是数值看不大出来,如果是对象的话,对象有很多属性,你就可以选择返回某些属性如p=>p.id.最后一句就是根据根据p值倒序排序.
而p=>p,就是lambda表达式.lambda表达式本质上就是一个匿名方法,而且是一个进一步简化的匿名方法,它依附于委托.
它的一般形式:
(输入参数列表)=>{语句序列} 如 x => {return x+1;}
=> :称为Lambda 运算符,读为“goesto”
它的发展过程是在C#1.0中使用的委托,C#2.0中添加了匿名方法,C#3.0中添加了lambda表达式.
C#1.0
首先定义一个委托:
- delegatestring ProcessString( string input );
委托的实例化和使用,
有一个方法LowerIt,用于将输入的值,转为小写.
- privatestring LowerIt(string input)
- {
- return input.ToLower();
- }
实例化委托,此时委托p就是这个LowerIt()方法.委托的实例化就是将委托变量p指向了LowerIt()方法,所以调用p("ABCD")也就是调用LowerIt("ABCD")
- ProcessStringp = new ProcessString( LowerIt );
- Console.WriteLine(p("ABCD"));
在C#2.0中,添加了匿名方法特性
- delegatestring ProcessString( string input );
- // 匿名方法方式,这里就没有上面的LowerIt这个方法名了.
- ProcessStringp = delegate( string input )
- {
- return input.ToLower();
- };
- Console.WriteLine(p("ABCD"));
而在C#3.0中使用简洁的lamdba表达式,上段代码就可以变为这样.
- delegatestring ProcessString( string input );
- // Lambda 表达式方式,p还是用于将input转为小写
- ProcessStringp = input => input.ToLower();
- Console.WriteLine(p("ABCD"));<span style="font-family: Calibri; "> </span>
介绍完一些理论知识,说说我在实际应用时,遇到的问题.
尽管我在使用的时候只使用过select和where,我第一次使用的时候,以为select是选择的意思,然后写var obj = objs.select(p=>p.Code='123') ,我以为他会给我找出所有Code为123的对象给我,后来发现不是这样的,他给我的是一个一堆123.就是说,假如objs有10条数据,Code为123的有3条,我是想查出这三条数据,但是最后查出10条,并且都是123,而且只会返回Code.所以obj其实是string[]类型.obj[0]到obj[9]都是123.所以应该用where操作.
如果把他们写成sql语句的样式,可能我会更容易理解.select code from table1 where p.Code='123'.这条语句只会返回Code一列给我,所以.select(p=>p.Code),只会返回Code一列给我.
写完这篇博客,对于linq和lambda表达式有了一点简单的了解,以后可以多多了解。
相关推荐
C#知识体系(一)常用的LINQ与Lambda表达式.pdf C#知识体系(一)常用的LINQ与Lambda表达式.pdf
什么是Linq表达式什么是Lambda表达式.pdf 什么是Linq表达式什么是Lambda表达式.pdf
很有价值的文档学习语法指南。。。 sql语句-linq语言-lambda...可以帮助对SQL、linq、lambda表达式存在疑惑不明白的在这里面可以充分提现出来语法间的对比和学习。让你逐渐对linq、lambda表达式有了解甚至使用。。。
Lambda表达式与LINQ.rar Lambda表达式与LINQ.rar Lambda表达式与LINQ.rar
C# Linq lambda表达式常用语法,示例:过滤,查找,排序,分组,TOP函数,union 函数,Join方法
Lambda表达式与LINQ.pdf Lambda表达式与LINQ.pdf Lambda表达式与LINQ.pdf
使用Linq语法与Lambda表达式分组取泛型数组某列的最小值/最大值
sql语句-linq语言-lambda表达式对照。 可以帮助对SQL、linq、lambda表达式存在疑惑不明白的在这里面可以充分提现出
.net 4.0新特性运用,简单实用(使用vs2010),linq to sql 和lambda表达式的结合,方便快捷的与数据库交互
理解类的重要概念和相关知识,理解C#中高级类型(例如可空类型、泛型等),Lambda表达式和LINQ的原理和使用。 字段是与类或类的实例关联的变量。 使用 static 修饰符声明的字段定义了一个静态字段 (static field)...
1、 查询Student表中的所有记录的Sname、Ssex和Class列。 SQL语句:select sname,ssex,class from student ...Lambda表达式: Students.Select( s => new { SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS })
分别对LINQ,LAMBDA表达式,匿名方法做了一下介绍和用法简介,可以作为入门的预备知识来看
一份易上手的C# Lambda表达式入门学习资料,适合新手完全不懂Lambda表达式的阅读
Linq_Lambda_Expressions Curso de Linq Lambda表达式
本书共分为13章,每一章侧重于特定主题的C#解决方案。具体内容包括:类和泛型,集合、枚举器和迭代器,...LINQ和lambda表达式 异常处理 反射和动态编程 正则表达式 文件系统交互 网络和Web XML的使用 线程、同步和并发
.net2.0使用Linq,lambada表达式,直接引用使用即可,从system.core中抽取的扩展。
Lambda表达式转SQL语句类库 一、可以达到的功能 本功能类库主要提供给代码中使用Lambda表达式,后需转成SQL的条件语句这一需求 二、不能做的 1、本类库不能解析Linq语句 2、不能解析SQL中的Select部分
C#连接数据库 —— (一)实体框架(EF)的创建 (Linq To EF) Linq 使用 首先,我们创建数据库实体对象(下面的所有操作都用到这个对象): var DataModelsDb = new DbTrainEntities(); 查询所有数据(对应SQL...
C#拥有许多强大的编程功能,如布尔条件、自动垃圾回收、标准库、组件版本管理、属性和事件、委托和事件管理、泛型、索引器、条件编译、多线程、LINQ和Lambda表达式等。 C#具有与Java非常相似的语法和编程风格,但在...