详解LINQ入门(上篇)

 更新时间:2020年6月25日 10:35  点击:1309

前 言

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

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

简 介

LINQ 是什么?引用官方术语“语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET work 3.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 = new List<int>();
foreach(int a in A){

  foreach(int b in b) {

    if (a==b) {
      c.add(a);
    }

  }

}

说明: 

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

IEnumerable<int> C = from a in A
           from b in B
           where a==b
           select a;

语 法

  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 = from n in nums where .... orderby... select....

扩 展

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

  1. 关键字 var :

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

  2. 匿名类型:  

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

案 例

普通查询

var query = from num in num 
      select num.ProperyA

筛选查询

var query = from obj in objs
      where obj.ProperyA > Condition
      select obj

分组查询

var query = from obj in objs
      group obj by obj.PropertyA into g
      orderby g.Key
      select g;

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

内联查询

var query= from obj1 in objs1
      join obj2 in objs2 on obj1.ID equals obj2.ID
      select new { A= obj1.Property, B = obj2.Property };

左外联查询

var query = from obj1 in objs1
      join obj2 in objs2 on obj1.ID equals obj2.Obj1ID into g
      from subpet in g.DefaultIfEmpty()
      select new { P1 = obj1.P1, P2 = (subpet == null ? null : subpet.P2 ) };

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • photoshop画斜线/直线/虚线的入门级教程

    这篇文章算是超级入门级别的了,我们下面来给各位介绍在photoshop画斜线/直线/虚线的教程了,希望下面这篇文章给你入门来帮助。 PS怎么画斜线 选择铅笔工具,或者画笔...2016-09-14
  • 20分钟MySQL基础入门

    这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
  • C#使用linq对数组进行筛选排序的方法

    这篇文章主要介绍了C#使用linq对数组进行筛选排序的方法,实例分析了C#实用linq扩展进行数组排序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中的Linq Intersect与Except方法使用实例

    这篇文章主要介绍了C#中的Linq Intersect与Except方法使用实例,本文直接给出示例代码,需要的朋友可以参考下...2020-06-25
  • 详解Servlet入门级设置(超详细 IDEA2020版)

    这篇文章主要介绍了详解Servlet入门级设置(超详细 IDEA2020版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
  • php入门教程(类实例教程)

    这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
  • MySQL的InnoDB引擎入门学习教程

    MySQL发展到今天,InnoDB引擎已经作为绝对的主力,除了像大数据量分析等比较特殊领域需求外,它适用于众多场景。然而,仍有不少开发者还在“执迷不悟”的使用MyISAM引擎,觉得对InnoDB无法把握好,还是MyISAM简单省事,还能支持快...2015-11-24
  • 阿里云ECS服务器入门使用流程(新手必看教程)

    这篇文章主要介绍了阿里云ECS服务器入门使用流程(新手必看教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-13
  • php入门级教程:PHP大小写问题

    PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。 今天写代码的时候发现自己代码的一处错误: $m_cate...2016-11-25
  • c# Linq常用的小技巧

    这篇文章主要介绍了c# Linq常用的小技巧,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • 一篇文章带你了解C语言:入门基础(2)

    这篇文章主要介绍了C语言入门之基础知识详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-08-04
  • Springboot入门案例及部署项目的详细过程

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,本文给大家分享一个入门案例使用Springboot1.5.9搭建,具体配置部署过程跟随小编一起看看吧...2021-07-12
  • 一篇入门的 Class 文章

    刚在大略浏览了一下首页更新的那篇有关Class的文章(指PHPE的那篇 http://www.phpe.net/articles/389.shtml ),很不错,建议看看。 对类的摸索~~俺用了半年时间才大概理解类的...2016-11-25
  • php入门教程:php rtrim()实例教程

    php入门教程:php rtrim()实例教程 定义和用法 该rtrim ( )函数将删除空格或其他预先确定的性质从右侧的一个字符串。 语法 rtrim(string,charlist) 参数说明 字符...2016-11-25
  • 一篇文章带你入门java算术运算符(加减乘除余,字符连接)

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下...2021-08-05
  • php基础入门篇-文件和目录操作

    一篇关于php 入门的朋友参考的关于文件和目录的各种操作函数与实例应用,有需要的朋友可以简单的参考一下。 本章可以算是上一章的延续,介绍了除文件实际内容之外的...2016-11-25
  • mongodb基础入门_动力节点Java学院整理

    这篇文章主要为大家详细介绍了mongodb基础入门的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-11
  • 带你入门Java的集合

    Java的集合类型都是对java.util包中Collection接口的继承,这里我们主要介绍依赖于collection的一些主分支,一起来看一下Java中的collection集合类型总结...2021-07-07
  • php入门教程第一课简单的PHP显示与嵌入PHP

    php入门教程第一课简单的PHP显示与嵌入PHP 代码如下 复制代码 <html> <head> <title>第一个php教程程序</title> </head> <body> <?php...2016-11-25