语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。

查询表达式(生成表达式)

1、IEnumerable<T> 查询编译为委托。如 source.Where(m=>m.Id>1) 返回一个表达式,这个表达式可以转为委托。

2、 IQueryable 和 IQueryable<T> 查询编译为表达式树。

存储查询结果(计算表达式)

两个测试帮助理解 什么是生成表达式什么是计算表达式

    public static class ListTest
{
public static List<T1> Source { get; set; } = new List<T1>
{
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
new T1{ Id=, Name="" },
};
public static void Test()
{
//注意循环性能 foreach (T1 item in Source)
{
if (item.Id <= )
{
continue;
}
//do something
} /**
// loop start (head: IL_002c)
IL_000f: ldloca.s 0
IL_0011: call instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<class IListTest.T1>::get_Current()
IL_0016: stloc.1
IL_0017: nop
IL_0018: ldloc.1
IL_0019: callvirt instance int32 IListTest.T1::get_Id()
IL_001e: ldc.i4.1
IL_001f: cgt
IL_0021: ldc.i4.0
IL_0022: ceq
IL_0024: stloc.2
IL_0025: ldloc.2
IL_0026: brfalse.s IL_002b IL_0028: nop
IL_0029: br.s IL_002c IL_002b: nop IL_002c: ldloca.s 0
IL_002e: call instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<class IListTest.T1>::MoveNext()
IL_0033: brtrue.s IL_000f
// end loop
*/ foreach (T1 item in Source.Where(m =>
{
return m.Id > ;
}))
{
//do something
} /*
// loop start (head: IL_0082)
IL_0078: ldloc.3
IL_0079: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<class IListTest.T1>::get_Current()
IL_007e: stloc.s 4
IL_0080: nop
IL_0081: nop IL_0082: ldloc.3
IL_0083: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
IL_0088: brtrue.s IL_0078
// end loop */ }
}
        private static string tag;
private static void Main(string[] args)
{ tag = "s";
//IEnumerable<T1> s = Init();//不同实例
List<T1> s = Init().ToList();//同实例
tag = "s2";
IEnumerable<T1> s2 = s.ToList();
if (ReferenceEquals(s.First(m => m.Id == ), s2.First(m => m.Id == )))
{
System.Console.WriteLine("同实例");
}
else
{
System.Console.WriteLine("不同实例");
}
System.Console.ReadLine();
} private static IEnumerable<T1> Init()
{
for (int i = ; i < ; i++)
{
System.Console.WriteLine(tag);
yield return new T1 { Id = i, Name = "name_" + i };
}
}

注意每次计算表达式时都会去生成新的实例,某些情况下不知晓会非常危险。

参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/index

https://docs.microsoft.com/zh-cn/dotnet/csharp/expression-trees

再次理解 C# LINQ的更多相关文章

  1. 再次理解HTTP请求过程[概念原理篇]

    我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...

  2. 再次理解WCF以及其通信(附加一個編程小經驗)

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  3. 再次理解JavaScript原型链和匿名函数

    <!--------------------------------------------- 1.演示匿名加载 2.js单进程执行流 3.原型链理解 a.__proto__:属性每个对象都有 ...

  4. F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解

    题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...

  5. 再次理解HTTP GET协议

    概述: 在上学的时候,以及在工作的这几年中,我一直错误了理解HTTP GET. 以前我的认知中认为GET/POST的区别在于: 1.GET长度限制 2.GET和POST的请求方式不一样(之前所理解的G ...

  6. 再次理解js中的call函数

    a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看 ...

  7. [转载]java.ByteArrayInputStream与ByteArrayOutputStream再次理解

    一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutpu ...

  8. 再次理解javascript的apply

    普通函数执行的时候,this指向函数执行的上下文  其实就是一个原型链的结构...    我一直没有搞懂原型链莫非它们像链条一样连在一起?    昂...   原型链可以理解成继承吗?   就像,ja ...

  9. C++再次理解虚表

    #include <iostream> using namespace std; class Base { public: virtual void fun1() { cout <& ...

随机推荐

  1. 给HTML页面指定元素添加属性,添加父元素

    给HTML页面指定元素添加属性,添加父元素 下面拿一个给富文本中所有的图片增加layer弹窗效果. 思路: 给富文本父元素设置属性. 获取父元素里所有的img   此处用到querySelectorA ...

  2. 翻译:SET Variable(已提交到MariaDB官方手册)

    本文为mariadb官方手册:SET Variable的译文. 原文:https://mariadb.com/kb/en/set-variable/我提交到MariaDB官方手册的译文:https:/ ...

  3. JavaScript 系列博客(三)

    JavaScript 系列博客(三) 前言 本篇介绍 JavaScript 中的函数知识. 函数的三种声明方法 function 命令 可以类比为 python 中的 def 关键词. functio ...

  4. Linux命令-基本操作和软件安装

    配置JDK环境:JAVA_HOME:D:\software\JDK1.7Path:%JAVA_HOME%\bin;%JAVA_HOME%\lib; ls(查看当前目录下的文件及文件夹)sh initN ...

  5. Scrapy爬虫(5)爬取当当网图书畅销榜

      本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下:   我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...

  6. Python图像处理之验证码识别

      在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract ...

  7. 第一册:lesson fifty three。

    原文: An interesting climate. A:where do you come from? B:I come from England. A:What's the climate li ...

  8. 【转载】阿里云服务器为网站选配Https证书

    数字证书是一个经权威授权机构数字签名.包含公开密钥拥有者信息以及公开密钥的文件,是权威机构颁发给网站的可信凭证.最简单的证书包含一个公开密钥.证书名称以及证书授权中心的数字签名,只在特定的时间内有效. ...

  9. json接口返回值

    SpringBoot响应客户端渲染数据 1.SpringBoot构造并且返回一个json对象 首先,我们在父包下新建一个pojo的包,并新建一个User类  IDEA自动生成对应的get/set,然后 ...

  10. springboot整合netty(二)

    目录 前言 正文 代码 1. 新建一个springboot项目,在pom文件中添加netty依赖: 2.新建netty服务 3.netty调用所需的服务类 4 springboot启动类 5.测试 我 ...