详解LINQ入门(上篇)

作者:森大科技 时间:2023-10-15 05:57:30 

前 言

最近和我们老大一起做技术面试(我是旁听的),发现前来面试的没几个掌握甚至是丁点了解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():如果序列为空,则返回一个具有默认值的单一实例集合

标签:LINQ,入门
0
投稿

猜你喜欢

  • Java实现数据连接池Druid举例

    2022-12-10 21:21:47
  • Unity3D实现分页系统

    2022-06-28 22:53:37
  • WPF实现倒计时转场动画效果

    2023-01-10 11:46:23
  • java实现捕鱼达人游戏

    2023-11-23 21:28:59
  • C# 使用Proxy代理请求资源的方法步骤

    2022-07-16 22:20:37
  • 详解Spring/Spring boot异步任务编程WebAsyncTask

    2022-12-18 00:40:23
  • Java为什么基本数据类型不需要进行创建对象?

    2022-03-16 08:59:03
  • java Stream流常见操作方法(反射,类加载器,类加载,反射)

    2022-03-24 06:54:56
  • ToLua框架下C#与Lua代码的互调操作

    2023-12-07 06:27:48
  • C#中的WebRequest与WebResponse抽象类、DNS静态类、Ping类介绍

    2022-12-28 05:22:15
  • Android点击按钮返回顶部实现代码

    2023-04-10 19:06:40
  • Android日期选择器实现年月日三级联动

    2022-12-13 03:35:59
  • java判断各类型字符个数实例代码

    2022-01-22 16:39:15
  • JAVA语言编程格式高级规范

    2021-08-21 01:43:54
  • C#自定义处理xml数据类实例

    2022-07-02 11:00:39
  • Android实现带描边的圆角图片

    2021-09-06 19:00:04
  • C语言结构体版学生成绩管理系统

    2021-11-05 03:29:41
  • android View 绘制完成监听的实现方法

    2023-08-06 20:47:05
  • Java 超详细讲解IO操作字节流与字符流

    2022-04-28 20:09:57
  • 详解Spring Cloud中Hystrix的请求合并

    2022-07-06 14:53:06
  • asp之家 软件编程 m.aspxhome.com