语言集成查询 (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. c++Volatile关键词

    看到的一篇文章觉得还不错吧,文章具体位置也找不到了,复制一下,留着日后复习 背景 此微博,引发了朋友们的大量讨论:赞同者有之:批评者有之:当然,更多的朋友,是希望我能更详细的解读C/C++ Volat ...

  2. WPF 水平进度条

    WPF设计界面过程中,有时需要设计一种可以手动滑动修改并实时显示的进度条 进度条,效果如下: 颜色.图标.节点什么的,都可以重新替换. 前端XAML代码: <UserControl x:Clas ...

  3. js实现带上传进度的文件上传

    //获取文件筐的文件集合 var files = document.getElementById("file1").files; //创建FormData对象 相当于参数集合 存储 ...

  4. EF Code First 导航属性 与外键(转载)

    EF Code First 导航属性 与外键 一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就 ...

  5. [android] activity横竖屏切换的生命周期

    模拟器横竖屏切换,ctrl+f11 界面activity会销毁,重新打开创建 第一种做法: 定死就是横屏 在清单文件,<activity/>节点部分,添加属性,设置屏幕朝向 android ...

  6. [nodejs] nodejs开发个人博客(五)分配数据

    使用回掉大坑进行取数据 能看明白的就看,看不明白的手动滑稽 /** * 首页控制器 */ var router=express.Router(); /*每页条数*/ var pageSize=5; r ...

  7. php中的implements 使用详解

    php类中接口的应用关键字是interface.implements了,接口是一种成员属性全部为抽象或常量的特殊抽象类,implements主要是对类名,类所拥有的方法,以及所传参数起约束和规范做用, ...

  8. 开源前端脚本错误监控及跟踪解决项目-BadJS 试用

    BadJS 是 一个web 前端脚本错误监控及跟踪项目.此项目为鹅厂 imweb(qq群:179045421) 团队的开源项目.此项目支持单机,集群,docker.存储支持mongodb等. 官网文档 ...

  9. 3款网页jQuery抽奖实例演示

    实例演示 实例演示 实例演示

  10. vuejs2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...