Linq之常见关键字

目录

写在前面

系列文章

常见关键字

总结

写在前面

前面的几篇文章算是对linq的铺垫,从本篇开始将进行linq的语法及实践。

系列文章

Linq之Lambda表达式初步认识

Linq之Lambda进阶

Linq之隐式类型、自动属性、初始化器、匿名类

Linq之扩展方法

Linq之Expression初见

Linq之Expression进阶

Linq之Expression高级篇(常用表达式类型)

常见关键字

什么情况下使用linq呢?

可以这样说,只要是实现了IEnumerable<T>接口的对象都可以使用Linq的语法来查询。

  而对于只实现了IEnumerable接口而没有实现IEnumerable<T>的对象可以通过如下的方法

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source);

来将IEnumerable接口转为IEnumerable<T>(例如ArrayList)。

那么在linq中常见的关键字有那些呢?

在c#3.0中,为linq引入了一下几个关键字:from join where group into let orderby select等。

如果你用过sql,那么你对它们并不陌生。语法很简单,这里就对每个简单的列举一个例子,以便你快速的回忆起他们的用法。

from

from子句是一个Linq查询的开始,任何一个Linq语句都是以from开始,from子句指定查询的容器,和在此语句有效的局部变量。from子句的语法为:

from localParameter in Source

从上面的语法你会发现和foreach何其相似。

foreach(var item in source)
{
      //循环体
}

通过上面的对比,你应该对localParameter和Source有个清楚的认识了。不过在linq中Source必须是实现IEnumerable<T>的对象。下面看一个例子: 

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<int> lstInts = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 6             IEnumerable<int> query = from i in lstInts
 7                                      select i;
 8             foreach (var item in query)
 9             {
10                 Console.WriteLine(item);
11             }
12             Console.Read();
13         }
14     }

结果

举得例子其实并没有实际意义,通过这样的例子,希望对linq有个大概的认识。由于source实现自IEnumerable<T>泛型接口,T可以由source推导出来,在这个例子中T为int。

那么对没有实现IEnumerable<T>而只实现IEnumerable接口的ArrayList,该如何使用linq呢?

此时,就需要我们显式指定局部变量的类型,或者是使用Cast转为IEnumerable<T>

例如:

1             IEnumerable<int> q2 = from i in arry.Cast<int>()
2                                   select i;
3             //或者
4             var q3 = from int i in arry
5                      select i;

select

对查询结果进行投影,有时我们并不需要所有的列,而只需要其中的某几个列的值,此时,select是非常有用的。

下面看一个例子

假如我们有这样一个类

1     class Person
2     {
3         public int ID { set; get; }
4         public string Name { set; get; }
5         public int Age { set; get; }
6     }

我们有这样一个集合

1             List<Person> persons = new List<Person>()
2             {
3                 new Person(){ ID=1, Age=20, Name="wolfy"},
4                 new Person(){ID=2,Age=22,Name="angle"}
5             };

现在我们要取出集合中所有人的姓名,即只投影某一列。

1             var pNames = from p in persons
2                          select p.Name;

当然我们也可以投影一个集合,此时就需要使用匿名类。

1             var persons2 = from p in persons
2                            select new { p.Name, p.Age };
3             //或者
4             var persons3 = from p in persons
5                            select new { name = p.Name, age = p.Age };
6             foreach (var item in persons3)
7             {
8                 Console.WriteLine(item.name + " " + item.age);
9             }

persons3中,在匿名类中,你可以显示的指定投影的列名。

where

对source中的数据进行筛选,看一个例子,选出所有的成年人的姓名。

            var persons4 = from p in persons
                           where p.Age > 18
                           select p.Name;

join

用法类似sql中join,将两个source以某种关系进行关联。

一个例子,查出公司为“北京能力有限公司”的人的名字和所在的公司名字。

 1     class Person
 2     {
 3         public int ID { set; get; }
 4         public string Name { set; get; }
 5         public int Age { set; get; }
 6         public int CompanyID { set; get; }
 7     }
 8     class Company
 9     {
10         public int ID { set; get; }
11         public string Name { set; get; }
12     }

 1             List<Person> persons = new List<Person>()
 2             {
 3                 new Person(){ ID=1, Age=20, Name="wolfy",CompanyID=1},
 4                 new Person(){ID=2,Age=22,Name="angle",CompanyID=2}
 5             };
 6             List<Company> companys = new List<Company>()
 7             {
 8                 new Company(){ ID=1, Name="北京能力有限公司"},
 9                 new Company(){ID=2,Name="北京无能有限公司"}
10             };
11             var result = from p in persons
12                          join c in companys on p.CompanyID equals c.ID
13                          where c.Name=="北京能力有限公司"
14                          select new { Name = p.Name, CompanyName = c.Name };
15             foreach (var item in result)
16             {
17                 Console.WriteLine(item.Name + " " + item.CompanyName);
18             }

结果

注意

join子句只能使用equals或者是not equal而不能用其他运算符(==都不行)。而equals运算符左边必须联接的左部,右边为右部,不能调换的,否则编译不能通过。

into和group

into子句用于将join或者是group子句的结果进一步持续化,包装成为一个System.Linq.IGrouping<TKey, TElement>对象,而且IGrouping继承自IEnumerable<TElement>,IGrouping接口提供分组的键和,该键下所包含的集合。

下面看一个例子

 1             List<string> lstNames = new List<string>() { "zhangsan", "lisi", "wanger", "mazi", "zhangwuji" };
 2             var result2 = from n in lstNames
 3                              group n by n.Length into g
 4                              select new { g.Key, values = g };
 5             foreach (var group in result2)
 6             {
 7                 Console.WriteLine("{0}:", group.Key);
 8                 foreach (var item in group.values)
 9                 {
10                     Console.WriteLine(item);
11                 }
12             } 

结果

let

let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见,类似sql中为as关键字为字段起别名。

1             var persons4 = from p in persons
2                            let age = p.Age
3                            where age > 18
4                            select p.Name;

 Take Skip

用于选取前几个或者和跳过前几个,如选择第11到20个则可以

1 query.Skip(10).Take(10);

跳过前十个,然后再取10条数据。

OrderBy OrderByDescending

query.OrderBy(c => c.Length);

总结

本篇文章介绍了在linq中常见的关键字,他们的作用可以类比sql中的用法。当然还有一些关键字,比如:Distinct Union Intersect Except,这些就不再举例了。感兴趣的可以自己动手试一试。

其它的样例代码可参考:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

参考文章

http://kb.cnblogs.com/page/100043/

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/4270911.html
时间: 2024-09-24 19:02:38

Linq之常见关键字的相关文章

java中的常见关键字解析_java

本文主要针对Java常见关键字final,static,super,this进行详细辨析,以方便读者参考查阅.具体如下: 一.final 1)修饰class(类): 表示此类不可被继承了 2)修饰method(方法) 表示此方法方法不可被重写(@override)了 3)修饰variable(变量) 表示此变量的值之后不可被改变了,常用于修饰不可变的常量 注:final字面意思是"最后"."不可更改"的意思,结合意思记忆更方便. 二.static(第二.三法常用)

Linq之Linq to Sql

目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍linq to sql的内容.个人觉得linq to sql在实际开发中在中小型项目中用的比较多,在中小型项目用ef或者nhibernate这些orm确实有点重量级.Linq to Sql提供了丰富的功能,完全可以满足日常数据访问的需求.使用方法也非常简单.灵活. 系列文章 Linq之Lambda表达

Linq之延迟加载特性

目录 写在前面 系列文章 延迟加载 总结 写在前面 上篇文章介绍了linq中常见的几个关键字,并列举了几个例子,算是对linq如何使用有了初步了解.上篇文章中也提到了,能够使用linq的场合有一个要求:实现IEnumerable<T>泛型接口,或者类型兼容(可以通过Cast方法转换,比如ArrayList). 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 Linq之扩展方法 Linq之Expression初见 Lin

Linq之Linq to XML

目录 写在前面 系列文章  linq to xml  总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将word文档另存为xml文件,这也提供了一种通过操作xml,操作word的一种方式)以及数据库中,都可以看到 XML.而linq to xml提供了一种操作xml更便捷的方式. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类

Android中比较常见的Java super关键字_java

super在android中比较常见,没有java基础也并不理解,所以空出时间学习了一下. 在Java类中使用super来引用基类的成分,比较简单,示例如下: class FatherClass{ public int value; public void f(){ value=100; System.out.println ("FatherClass.value:"+value); } } class ChildClass extends FatherClass{ public in

Linq学习笔记

写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些兴趣,所以打算整理点东西出来跟大家一起做个分享. 什么是Linq LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知.静态类型等强类型语言的好处.并

[转] LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引。

Where 子句的用法 我们除了可以如下方式书写带Where子句的LINQ外: from p in products where p.UnitsInStock > 0 && p.UnitPrice > 3.00M select p; 还可以对数组(所有实现了IEnumerable接口的对象都可以)的实体使用 Where 扩展方法.   把一个查询语句写成多个扩展函数的方式,这其实是编译器处理查询语句的方法,比如下面的查询语句: int[] arr = new int[] { 8

Linq 扩展函数的应用

问题描述 xxx.Where((aa,bb)=>aa.Length<bb);明白以上代码是什么意思?(大家都是谈初学,高手浏览即可)1.Where子句其实是用扩展方法来实现的MS实现的Where子句对应的扩展函数是如下的定义:namespaceSystem.Linq{publicdelegateTResultFunc<TArg0,TArg1,TResult>(TArg0arg0,TArg1arg1);publicstaticclassEnumerable{publicstaticI

Linq“.NET技术”学习笔记

写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些兴趣,所以打算整理点东西出来跟大家一起做个分享. 什么是Linq LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知.静态类型等强类型语言的好处.并