目录

写在前面

系列文章

常见关键字

总结

写在前面

前面的几篇文章算是对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>的对象。下面看一个例子:

     class Program
{
static void Main(string[] args)
{
List<int> lstInts = new List<int>() { , , , , , , , , };
IEnumerable<int> query = from i in lstInts
select i;
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.Read();
}
}

结果

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

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

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

例如:

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

select

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

下面看一个例子

假如我们有这样一个类

     class Person
{
public int ID { set; get; }
public string Name { set; get; }
public int Age { set; get; }
}

我们有这样一个集合

             List<Person> persons = new List<Person>()
{
new Person(){ ID=, Age=, Name="wolfy"},
new Person(){ID=,Age=,Name="angle"}
};

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

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

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

             var persons2 = from p in persons
select new { p.Name, p.Age };
//或者
var persons3 = from p in persons
select new { name = p.Name, age = p.Age };
foreach (var item in persons3)
{
Console.WriteLine(item.name + " " + item.age);
}

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

where

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

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

join

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

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

     class Person
{
public int ID { set; get; }
public string Name { set; get; }
public int Age { set; get; }
public int CompanyID { set; get; }
}
class Company
{
public int ID { set; get; }
public string Name { set; get; }
}
             List<Person> persons = new List<Person>()
{
new Person(){ ID=, Age=, Name="wolfy",CompanyID=},
new Person(){ID=,Age=,Name="angle",CompanyID=}
};
List<Company> companys = new List<Company>()
{
new Company(){ ID=, Name="北京能力有限公司"},
new Company(){ID=,Name="北京无能有限公司"}
};
var result = from p in persons
join c in companys on p.CompanyID equals c.ID
where c.Name=="北京能力有限公司"
select new { Name = p.Name, CompanyName = c.Name };
foreach (var item in result)
{
Console.WriteLine(item.Name + " " + item.CompanyName);
}

结果

注意

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

into和group

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

下面看一个例子

             List<string> lstNames = new List<string>() { "zhangsan", "lisi", "wanger", "mazi", "zhangwuji" };
var result2 = from n in lstNames
group n by n.Length into g
select new { g.Key, values = g };
foreach (var group in result2)
{
Console.WriteLine("{0}:", group.Key);
foreach (var item in group.values)
{
Console.WriteLine(item);
}
}

结果

let

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

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

 Take Skip

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

 query.Skip().Take();

跳过前十个,然后再取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/

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

  1. PHP 面向对象中常见关键字使用(final、static、const和instanceof)

    PHP 面向对象中常见关键字的使用: 1.final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用fin ...

  2. linq中let关键字学习

    linq中let关键字就是对子查询的一个别名,let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见. linq中let关键字实例 1.传统下的子查询与LET关键字的区别     C# 代 ...

  3. c/c++常见关键字解释

    c语言中常见关键字:  char :    =>声明字符型变量或函数 double :=>声明双精度变量或函数 enum :  =>声明枚举类型 float:     =>声明 ...

  4. python常见关键字的使用

    常见关键字 在循环中常见的关键字使用方法 continue:结束本次循环,继续执行下一次循环 break:跳出一个循环或者结束一个循环 例 使用用户名密码登录(有三次机会)count=0while c ...

  5. Java 常见关键字总结:final、static、this、super!

    final,static,this,super 关键字总结 final 关键字 final关键字,意思是最终的.不可修改的,最见不得变化 ,用来修饰类.方法和变量,具有以下特点: final修饰的类不 ...

  6. 1218.1——OC中的常见关键字及一些基本方法

    OC常见的关键字介绍: @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如@interface XXX. @interface 声明类 @implementation 实现类 ...

  7. JAVA基础3——常见关键字解读(1)

    常见的JAVA中的关键字 static static静态变量 静态变量:使用static关键字定义的变量.static可以修饰变量和方法,也有static静态代码块.被static修饰的成员变量和成员 ...

  8. LINQ之let关键字

    let子句用于在LINQ表达式中存储子表达式的计算结果.let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. 实例1 ...

  9. Linq Query常见错误

    1.只能对 Type.IsGenericParameter 为 True 的类型调用方法 对于此错误,一般常见在虚拟实体,但是要把条件拼接在Expression中,通常是因为该字段在数据库中是可空的, ...

随机推荐

  1. Mac OS X 设置取消开机自动启动

    1. 启动系统设置 (System Preferences) 2. 点以上截图的 用户/组 (User&Groups) 3. 切换到 “登录选项” (Login Items) 可以看到有saf ...

  2. NOIP2007 T1奖学金 解题报告-S.B.S.

    洛谷P1093 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同, ...

  3. 译:Google的大规模集群管理工具Borg(二)------ Borg架构

    3.Borg 架构 一个Borg的cell由一系列的机器组成,通常在cell运行着一个逻辑的中央控制器叫做Borgmaster,在cell中的每台机器上则运行着一个叫Borglet的代理进程.而Bor ...

  4. selenium如何随机选取省份和城市的下拉框的值

    1.原始需求,选择省份后,相应的城市会自动加载 2.思路 a.获取下拉框的所有元素个数 b.随机点击0-元素个数之间的某个值 3.代码实现 Random random = new Random(); ...

  5. Codeforces Round #370 (Div. 2)C. Memory and De-Evolution 贪心

    地址:http://codeforces.com/problemset/problem/712/C 题目: C. Memory and De-Evolution time limit per test ...

  6. 2014 Super Training #9 C E - Cup 2 --记忆化搜索

    原题:ZOJ 3681 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3681 题意:给一个m,n,m表示m个人,可以把m个 ...

  7. mysql查询语句包含有关键字

    查询mysql的时候,有时候mysql表名或者列名会有关键字.这时候查询会有错误.例如表名是order,查询时候会出错. 简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别,例如se ...

  8. Android签名机制:生成keystore、签名、查看签名信息

    转自:http://www.ourunix.org/post/146.html

  9. Android 手势识别类 ( 一 ) GestureDetector 基本介绍

    为了加强鼠标响应事件,Android提供了GestureDetector手势识别类.通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Ta ...

  10. 25Mybatis_查询缓存的基本知识

    mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级和二级缓存的示意图: