LINQ

  1.查询操作符

    (1)源起

      .net的设计者在IEnumerable<T>等接口基础之上定义了一系列的扩展方法来方便用户操作集合对象,这些扩展方法构成了LINQ的查询操作符

    (2)使用

      这一系列的扩展方法,比如:Where,Max,Select,Sum,Any,Average,All,Concat等

      都是针对IEnumerable的对象进行扩展的,也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法     

            List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => { return a > 3; }).Sum();
Console.WriteLine(result);
Console.ReadKey();

      这段代码中,用到了两个扩展方法。

      <1>

        Where扩展方法,需要传入一个Func<int,bool>类型的泛型委托

        这个泛型委托,需要一个int类型的输入参数和一个布尔类型的返回值

        我们直接把a => { return a > 3; }这个lambda表达式传递给了Where方法

        a就是int类型的输入参数,返回a是否大于3的结果。

      <2>

        Sum扩展方法计算了Where扩展方法返回的集合的和。

    (3)好处

      上面的代码中arr.Where(a => { return a > 3; }).Sum();这一句完全可以写成代码:(from v in arr where v > 3 select v).Sum();

      两句代码的执行细节是完全一样的,大家可以看到,第二句代码更符合语义,更容易读懂。第二句代码中的where,就是我们要说的查询操作符。     

  2.查询表达式

    (1)源起

      上面我们已经提到,使用查询操作符表示的扩张方法来操作集合

      虽然已经很方便了,但在可读性和代码的语义来考虑,仍有不足

      于是就产生了查询表达式的写法。虽然这很像SQL语句,但他们却有着本质的不同。

    (2)用法

      from v in arr where v > 3 select v 这就是一个非常简单的查询表达式

注意:并不是所有的查询操作符都有对应的查询表达式,操作符和表达式两者建议优先使用查询操作符

    (3)说明:

      先看一段伪代码:      

      from [type] id in source
      [join [type] id in source on expr equals expr [into subGroup]]
      [from [type] id in source | let id = expr | where condition]
      [orderby ordering,ordering,ordering...]
      select expr | group expr by key
      [into id query]

      <1>第一行的解释:

        type是可选的,id是集合中的一项,source是一个集合,

        如果集合中的类型与type指定的类型不同则导致强制转化

      <2>第二行的解释:        

        一个查询表达式中可以有0个或多个join子句,

        这里的source可以不等于第一句中的source

        expr可以是一个表达式

        [into subGroup] subGroup是一个中间变量,

        它继承自IGrouping,代表一个分组,也就是说“一对多”里的“多”

        可以通过这个变量得到这一组包含的对象个数,以及这一组对象的键

        比如:        

        from c in db.Customers
    join o in db.Orders on c.CustomerID
    equals o.CustomerID into orders
    select new
    {
    c.ContactName,
    OrderCount = orders.Count()
    };

      <3>第三行的解释:     

        一个查询表达式中可以有1个或多个from子句

        一个查询表达式中可以有0个或多个let子句,let子句可以创建一个临时变量

        比如:        

            from u in users
    let number = Int32.Parse(u.Username.Substring(u.Username.Length - 1))
    where u.ID < 9 && number % 2 == 0
    select u

        一个查询表达式中可以有0个或多个where子句,where子句可以指定查询条件

      <4>第四行的解释:

        一个查询表达式可以有0个或多个排序方式

        每个排序方式以逗号分割

      <5>第五行的解释:

        一个查询表达式必须以select或者group by结束

        select后跟要检索的内容

        group by 是对检索的内容进行分组

        比如:        

            from p in db.Products
    group p by p.CategoryID into g
    select new { g.Key, NumProducts = g.Count()};

      <6>第六行的解释:

        最后一个into子句起到的作用是

        将前面语句的结果作为后面语句操作的数据源

        比如:        

            from p in db.Employees
    select new
    {
    LastName = p.LastName,
    TitleOfCourtesy = p.TitleOfCourtesy
    } into EmployeesList
    orderby EmployeesList.TitleOfCourtesy ascending
    select EmployeesList;

Linq第三讲的更多相关文章

  1. NET基础课--Linq第三讲

    LINQ 1.查询操作符 (1)源起 .net的设计者在IEnumerable<T>等接口基础之上定义了一系列的扩展方法来方便用户操作集合对象,这些扩展方法构成了LINQ的查询操作符 (2 ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  4. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  5. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  6. LINQ to SQL语句(7)之Exists/In/Any/All/Contains

    适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...

  7. .NET深入实战系列—Linq to Sql进阶

    最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基于:UserInfo与Class两个表,其中Cla ...

  8. LINQ Group By操作

    在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...

  9. Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数

    11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...

随机推荐

  1. QTP脚本汇总比较有价值

    1.Object Spy的Tips Hold the CTRL key to change the window focus or perform other mouse operations  2. ...

  2. 开机自动挂载 VHD 的方法

    一.批处理 除了将 VHD 文件用人工方式在[磁盘管理]里[附加]来挂载以外,也能用[脚本]来实现自动挂载. 打开[启动],将写好的 mount.bat 放入即可: Mount.bat 文件的内容为: ...

  3. 安装Postgresql踩过的坑

    PG安装相关的 1  系统语言的设置 PG的安装,和系统的locale设置有一定的关系,需要设置,如在.profile或.bashrc中 也可以运行下面的命令: dpkg-reconfigure lo ...

  4. @@identity的用法

    问题描述:两张表,比如说A表和B表.A表中的id为自增的,B表中的id为外键,插入时不能为空. 解决办法: 用select @@identity得到上一次插入记录时自动产生的ID,将@@identit ...

  5. js监听事件 上滑消失下滑出现的效果 触摸与手势事件

    https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...

  6. android 一些数据转换方法

    android 一些数据转换方法 package com.ai9475.util; import android.content.Context; import android.content.res ...

  7. 《JS权威指南学习总结--第十一章子集和扩展》

    js子集和扩展:http://www.cnblogs.com/ahthw/p/4298449.html ES6新增let和const关键字:http://www.cnblogs.com/telnetz ...

  8. “this”总结

    this 的几种情况: function a(){ alert(this); } 1.直接调用a()时,this指的是window对象. 2.对象调用 var obj = { a : a}obj.a( ...

  9. 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

    游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...

  10. Android常用Permission

    位置相关: android.permission.WRITE_GSERVICES 允许程序修改Google服务地图(Allows an application to modify the Google ...