什么是Linq表达式?什么是Lambda表达式?

如图:

由此可见Linq表达式和Lambda表达式并没有什么可比性

那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在《深入理解C#》中称为点标记

查询表达式、点标记你更喜欢哪个?

所以,我们的标题的提问根本就不合适。应该是“查询表达式和点标记你更喜欢哪个?”。如:

  1. //查询表达式
  2. var students1 = from t in db.Students
  3. where t.Name == "张三"
  4. select new { t.Id, t.Name, t.Age };
  5. //点标记
  6. var students2 = db.Students
  7. .Where(t => t.Name == "张三")
  8. .Select(t => new { t.Id, t.Name, t.Age });

为什么选择点标记

我相信更多的人偏向选择点标记。具体什么原因我也说不清(可能是点标记中的Lambda更加优雅吧)。对于我个人来说,也是更加喜欢点标记这种方式。

1、所有的查询表达式都可以转成对应的点标记。反之,不是所有的点标记都可以转成查询表达式。

为什么?因为查询表达式在编译后就直接变成了点标记:(以下是上面两个语句对应的编译后的反编译C#代码)

生成了一模一样的代码。(由于是编译后的,好多乱七八糟的代码。我们只看Where和Select关键字就知道,使用的都是点标记。)

2、点标记确实比查询表达式更加优雅

例一:

  1. //查询表达式
  2. var students1 = from t in db.Students
  3. where t.Name == "张三"
  4. select t;
  5. //点标记
  6. var students2 = db.Students
  7. .Where(t => t.Name == "张三");

我为什么一定要 select t 啊,这句没卵用的废话就不能省吗?是的,省了就报错:

例二:

必须需要括号包裹起来才能取结果集?你还能更丑一点吗?

  1. //查询表达式
  2. var students1 = (from t in db.Students
  3. where t.Name == "张三"
  4. select t).ToList();
  5. //点标记
  6. var students2 = db.Students
  7. .Where(t => t.Name == "张三")
  8. .ToList();

例三:(为什么说:"不是所有的点标记都可以转成查询表达式"【此例只适用于IEnumerator】)

此条点标记你能转成查询表达式吗?

  1. var list = new List<string>() { "张三", "张三", "张三", "张三", "李四", "张三", "李四", "张三", "李四" };
  2.  
  3. var students2 = list
  4. .Where((item, index) => item == "张三" && index % == )
  5. .Select((item, index) => new { item, index })
  6. .ToList();

查询表达式你能Reverse吗?

  1. var list = new List<string>() { "张三1", "张三2", "张三3", "张三0", "李四9", "张三3", "李四", "张三2", "李四" };
  2.  
  3. var students2 = list
  4. .Where((item, index) => item.Contains("张三"))
  5. .Select((item, index) => new { item, index })
  6. .Reverse()//反序
  7. .ToList();
  1. ListA.Distinct().ToList();//去重
  2. ListA.Except(ListB).ToList();//差集
  3. ListA.Union(ListB).ToList(); //并集
  4. ListA.Intersect(ListB).ToList();//交集

什么时候使用查询表达式?

通过上面的对比,好像查询表达式一文不值了。no,不是这样的。

比如下面几种情况我们就可以选择使用查询表达式:

例一:本例适用于Linq to Object 和 没有建主外键的EF查询

点标记中的Join需要传四个参数表达式,是不是有点晕了。。。

  1. var list1 = new Dictionary<string, string> { { "", "张三" }, { "", "李四" }, { "", "张三" }, { "", "张三" } };
  2. var list2 = new Dictionary<string, string> { { "", "张三" }, { "", "李四" }, { "", "李四" }, { "", "张三" } };
  3.  
  4. //查询表达式
  5. var obj1 = from l1 in list1
  6. join l2 in list2
  7. on l1.Key equals l2.Key
  8. select new { l1, l2 };
  9. //点标记
  10. var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });

例二:

点标记需要区分OrderBy、ThenBy有没有觉得麻烦

  1. //查询表达式
  2. var obj1 = from l1 in list1
  3. join l2 in list2
  4. on l1.Key equals l2.Key
  5. orderby l1.Key, l2.Key descending
  6. select new { l1, l2 };
  7. //点标记
  8. var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 })
  9. .OrderBy(li => li.l1.Key)
  10. .ThenByDescending(li => li.l2.Key)
  11. .Select(t => new { t.l1, t.l2 });

总觉得查询表达式更多的只是为了照顾那些写惯了sql的程序员。

联接查询(内联、左联、交叉联)

关于联接查询使用查询表达式会更合适一些这个上面已经说了。

接下来我们写内联、左联、交叉联的查询表达式和对应的点标记代码。(目的:可能有些人不会,同时在这里也给自己做个备忘)

内联:

左联:

交叉联:

其实关于联接查询,如果EF建好了主外键我还是觉得点标记用起来更爽爽的。

结束:

本文并不是要改变你的习惯,也不是否定你的观点。仅仅只是表达个人对点标记和查询表达式的些许理解。

关于是使用查询表达式还是点标记,可能起着更大决定性的作用的是团队共同的习惯和规范。

本文以同步至《C#基础知识巩固系列

Linq表达式、Lambda表达式你更喜欢哪个?的更多相关文章

  1. Linq之Lambda表达式初步认识

    目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说 ...

  2. 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象

    本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...

  3. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  4. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  5. LInq 与lambda表达式

    LInq 与lambda表达式 LinQ是我们常用的技术之一.因为我们绕不开的要对数据进行一系列的调整,如 排序. 条件筛选.求和.分组.多表联接 等等. lambda则是我们常用的语法糖,配合lin ...

  6. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  7. APS.NET MVC + EF (01)---Linq和Lambda表达式

    1.1 Linq介绍 LINQ全称 Language Integrated Query(语言集成查询).为我们提供一种统一的方式来查询和操作各种数据. LINQ to Object:是针对实现了IEn ...

  8. LINQ和Lambda表达式

    前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ...

  9. LINQ使用Lambda表达式选择几列

    学习LINQ的Lambda的表达式,尝试从数据集合中,选择其中几列. 创建一个model: source code: namespace Insus.NET.Models { public class ...

  10. Linq之Lambda表达式

    一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...

随机推荐

  1. .NET Core全新路线图

    .NET Core / ASP.NET Core 1 RTM发布两周后,社区也很积极,收到了非常多的反馈,上周五微软的scott Hunter 在dotnet团队官方博客上发布了.NET Core全新 ...

  2. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  3. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  4. HTML骨架结构

    前面的话   一个完整的HTML文档必须包含3个部分:文档声明.文档头部和文档主体.而正是它们构成了HTML的骨架结构.前面已经分别介绍过文档声明和文档头部,本文将详细介绍构成HTML骨架结构的基础元 ...

  5. [C#] 简单的 Helper 封装 -- CookieHelper

    using System; using System.Web; namespace ConsoleApplication5 { /// <summary> /// Cookie 助手 // ...

  6. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  7. Android中通过ActionBar为标题栏添加搜索以及分享视窗

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...

  8. Atitit.研发团队与公司绩效管理的原理概论的attilax总结

    Atitit.研发团队与公司绩效管理的原理概论的attilax总结 1. 四个理念 1 1.1. 绩效管理的三个目的.四个环节.五个关键2 1.2. 绩效目标smart2 2. 考核对象2 3. 绩效 ...

  9. Maven安装

    开发分布式的商场系统,用到了一些新的技术,做一个记录和分享 这里讲一下maven安装 首先什么是Maven Maven作为一个构建工具,不仅帮我们自动化构建,还能抽象构建过程,提供构建任务实现.他跨平 ...

  10. php利用root权限执行shell脚本

    vi /etc/sudoers , 为apache用户赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方) root  ALL=(ALL)  ALL apache  ALL= ...