首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

那么在LINQ中来说,我们无法通过一个方法多次调用来产生我们想要的表达式树,一个Where查询表达式扩展方法可能不仅仅是被LINQ查询表达式所使用,还有可能被ORM的入口方法所使用,比如Update更新的时候就需要...那么我们如何构造出一个类似递归但不是递归的算法结构,方法1可能被方法2调用,方法2也可能被方法1所调用,这样的方法很多,N个方法分别表达不同的语义,具体的构造看使用者的需求,所以这里就出现碎片化的概念了...apple在一开始的时候都是需要在上面贴一个小logo的,我们吃苹果的都知道的。...N层对象体现在哪里?从一开始的IQueryable被扩展方法所处理就已经开始第一层的对象处理,重复性的环路假递归似的调用就形成N层对象模型。...(ExpressionTree),手动构建过表达式树的朋友都会觉得很麻烦(对动态表达式有兴趣的可以参见本人的“.NET深入解析LINQ框架(三:LINQ优雅的前奏)”一文),所以我们可以通过直接编写Lambda

1K30

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

LINQ支撑原理进行了大片理论的介绍,不知道效果如何; 在结束上一篇文章的时候,看到一个前辈评论说建议我多写写LINQ使用方面的,而不是讲这些理论。...顺便借此机会解释一下,本人觉得LINQ使用文章网上铺天盖地,实在没有什么必要更没有价值去写,网上的LINQ使用性的文章入门到复杂的应用实在是太多了,不管是什么级别的程序员都能找到适用的文章。...还有就是继承IEnumerable对象让我们自己的集合类型具备LINQ的强类型的查询能力。当然具体要看我们需求,技术角度看目前只有这两点可以扩展。...所以要注意本次的调用将是接着上一次调用,而不是以个新的开始。理解这一点对后面的LINQ分析很关键。 ?...3.4】.链式查询方法的设计误区(重点:一次执行程序多次处理) 在使用IQueryable时,我们尝试分析源码,看看IQueryable内部使用原理来帮我们生成表达式树数据的,我们顺其自然的看到了

1.4K11
您找到你想要的搜索结果了吗?
是的
没有找到

C# 学习笔记(14)—— LINQ

这个组件可以查询集合数据,如数组或List等 LINQ 好在哪里 LINQ 的四个组件分别实现了对不同的数据类型进行增、删、改、查等操作,在 LINQ 提出之前,C# 也是有相关技术 完成这些操作的。...但使用 XPath 时必须首先知道 XML 文件的具体结构,而使用 Linq to XML 则不需要知道这些。...,使用 XPath 方式来查询 XML 文件时,需要首先知道 XML 文件的具体结构,这样才能出实话选择路径(如代码中的选择路径就指定为“/Persons/Person”) 使用 Linq to XML...,使用 Linq to XML 查询 XML 文件,代码明显简洁很多,只需要一个查询表达式即可,不需要知道并制定选择路径,也不需要过多的 if 条件判断语句,代码看起来更直接 Linq to DataSet...,它的内容可以写厚厚一本书了 理解 LINQ 的本质 对于编译器而言,使用 LINQ 查询表达式的代码于使用方法调用的代码完全没有区别 归纳总结 数据查询如果使用 LINQ 的方式去实现,要考虑数据量,

19510

.NET深入解析LINQ框架(三:LINQ优雅的前奏)

其实动态LINQ查询所能执行的最关键的因素在于Expression对象是可以被动态编译成可以执行的委托对象,委托对象是完全可以被直接使用的可执行代码段,这就为动态LINQ查询提供了基础。...对于IEnumerable类型的查询表达式方法都知道它的执行是不会直接接受Expression类型对象的,那么动态LINQ是否能工作于IEnumerable接口?...为什么需要动态LINQ查询,上面说过问题出在我们没办法在运行时再去编写Lambda表达式了,都知道Lambda表达式到最后就是被编译成Expression表达式树对象,所以我们可以在运行时自己动态的构建...现在的需求是界面上接受一个Name值的输入,LINQ的查询只需要直接写就行了。...,不过目前还不是很成熟,动态对象的成员没有智能提示,应该是还没有被大面积使用起来,以后肯定也是一大美餐; 总结:LINQ框架的基本使用原理就全部结束了,后面我们就来学习如何能让LINQ查询我们自定义的数据源

1.6K20

.NET面试题系列 - .NET框架基础知识(2)

3 程序集 面试出现频率:虽然很重要但不怎么出现,可能会考你定义,以及程序集包括什么,然后自然的话题就跑到反射上去了。 重要程度:8/10,很重要 需要理解的程度:知道程序集包括IL和元数据。...知道元数据的作用以及反射的概念。知道GAC是什么。关于反射在后面另有独立章节。对于程序集的强命名,个人认为过于偏僻。... .NET Framework 4 开始,全局程序集缓存的默认位置为 %windir%\Microsoft.NET\assembly。...问:那你都删了之后,Console类型哪里来? 答:mscorlib.dll里来。...LINQ统一了各种资源(XML,各类型数据库)的访问和筛选方式,如果你熟悉表达式树,你甚至可以写一个自己的LINQ TO something。统一的过程就是解放开发者的过程。

1.2K20

.NET深入解析LINQ框架(一:LINQ优雅的前奏)

它的优雅不是一天两天就修来的,归根到底还得感谢C#的设计师们,是他们让C#能如此完美的演变,最终造就LINQ的优雅。 下面我们来通过观察C#的每一次演化,到底在哪里造就了LINQ的优雅前奏。...下面我们来看一个小示例,简单的了解一下Lambda的使用原理,最重要的是它优于匿名委托哪里?...可是我尝试了很多种方式就是过不起。...而如果我们使用字符串的方式来表达逻辑的结构,那么我们只能在运行时才能知道它的正确性,这样的正确性是很脆弱的,不知道在什么样的情况下会出现问题。...我们都知道表达式节点各种各样,需要具体化后才能直接使用

1.8K31

「零门槛多语言 PythonCC# 通用思想学习系列」第一篇:经典HelloWorld

听得懂的话就是:C# 可以在.NET 平台上快速开发应用程序;例如开发一个图书管理系统、一个影音播放器、一个动态桌面、一个资源管理器等;可以快速的满足你的开发欲望!...在编程中,一般是使用函数输出(显示)我们需要显示的内容;函数和数学中的函数并不一致,可能某些概念上相同,但不是一个东西;不要去误解,不然数学不好的童鞋会觉得这个东西自己难以学会,心理上就开始畏惧,这很不好...开始编写 HelloWorld 程序 在之前说过,在大多数编程语言中,想要显示 HelloWorld 是使用函数,那我们就来了解一下 Python、C、C# 这三个编程语言用来输出显示字符串是使用什么函数吧...我们可以尝试一下修改圆括号里面的值,想显示什么就修改什么,看看会不会输出。 C语言输出显示 刚刚我们知道了Python 程序在运行时如何显示字符,那么C语言的大家是不是有了什么思路?...“;”表示结束;我们现在再加个分号就正确了: printf("HelloWorld"); 那么这个代码放在哪里呢?

65830

一劳永逸地搞懂 JavaScript中‘this’

“this”在全局上下文中:基础开始 当你刚开始理解JavaScript中的 this 关键字时,最好从头开始 —— 也就是全局上下文。但是,我们说的全局上下文是什么意思呢?...这都是关于你来自哪里的 你知道在生活中,我们中的一些人根据我们所在的地方和我们与谁在一起会戴不同的帽子吗?常规函数也做类似的事情与 this。...他们他们的周围抓住 this 的值,并坚持使用它。无论他们去哪里或如何被使用。...如果需要,使用bind或箭头函数来确保正确的上下文。 构造函数和箭头函数:如前所述,箭头函数不绑定自己的 this。尝试使用它们作为构造函数可能会导致错误。...} }; person.greet(); // 输出:Hello, undefined 动态方法:当你动态地添加方法到一个对象时,确保你知道this引用的是什么。

10410

.NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)

我们需要自己去验证一下到底能提高多少处理速度和它的优势在哪里;要不然效率上不去反而还低下,查看代码也不能很好的断定哪里出了问题,所以还是需要系统的学习总结才行; 现在的系统已经不在是以前桌面程序了,也不是简单的...{ 3 // 4 }); View Code 第一个参数是索引的开始,第二个参数是循环总数,第三个是执行体,参数是索引值;使用起来其实很简单的...; 3.3】并行LINQ(PLINQ) 首先PLINQ是只针对Linq to Object的,所以不要误以为它也可以使用Linq to Provider,当然自己可以适当的封装;现在LINQ使用率已经很高了...,我们在做对象相关的操作时基本上都在使用LINQ,很方便,特别是Select、Where非常的常用,所以.NET并行循环也在LINQ上进行了一个封装,让我们使用LINQ的时候很简单的使用并行特性; LINQ...核心原理的文章:http://www.cnblogs.com/wangiqngpei557/category/421145.html 根据LINQ的相关原理,知道LINQ是一堆扩展方法的链式调用,PLINQ

1.8K100

编程之魂之C# – 与C#之父Anders的访谈

你可以在这个过程中使用已有的组件。 Anders:当然,.NET一开始,我们就已经在每一次发布中都保持向下兼容。...Brian Kernighan说,如果你想创建一种通用语言,你就应该铭记这一目标开始。否则,如果您创建一个小的语言,一旦人们开始使用它,他们就会要求添加新特性。培育一个DSL效果通常不会很好。...动态语言可能促使你以第三种方式思考问题。不同的语言可以促使你进行不同的思考。有时尝试从不同;角度来处理问题是很有益的。...这并不是说已经在行业中存在了10年,而是我们内部开始做的时候算起来是10年。我认为我们至少还会使用10年,不过这要视情况而定。...一旦你停止了发展,我不知道你还能增添什么价值。再者,这是极端的观点来看的。当然,平台的稳定性很有价值,不过,我认为你是通过确保向下兼容来提供的这种价值的。在C#1.0中,你可以随便下车但不能走开。

76320

C#中一些好用但不为人知的特性

本号已有原创文章250+篇,以软件工程为纲,DevOps为基,洞察研发效能全貌,涵盖需求管理、应用开发、软件测试、发布部署到运营监控的完整流程。...以下将详细介绍C#中一些好用但不为人知的特性,帮助你更好地利用C#进行开发。...LINQ(Language Integrated Query) LINQ是C#中一个强大的查询语言,它允许你使用类似SQL的语法对数据集合进行查询和操作。...动态类型(Dynamic Types) 动态类型在C#中允许你在运行时解析和操作对象。通过将变量声明为dynamic类型,你可以在运行时调用方法和属性,而不需要提前编译时解析。...这使得与COM互操作、JSON解析等动态行为变得更加简单。 6.

9510

由浅入深表达式树(二)遍历表达式树

表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。...但是不知道多少人是对它理解的很透彻, 在上一篇Lambda表达式的回复中就看的出大家对Lambda表达式和表达式树还是比较感兴趣的,那我们就来好好的看一看这个造就了LINQ to SQL以及让LINQ...的确,表达式的类型有很多,光我们上一篇列出来的就有23种,但使用起来并不复杂,我们只需要大概知道一些表达类型所代表的意义就行了。...要实现这个功能,首先我们得知道IQueryable的Where 方法在哪里,它是如何实现的?...throw new NotSupportedException(string.Format("方法{0}不支持", m.Method.Name)); }   代码很简单,方法名是Where那我们就直接开始

1.1K50

AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口

调整了WinForm/WPF运行容器         AgileEAS.NET平台支持了WPF技术,但对于我们现行的客户来说,使用最多的还是Winform技术,WPF技术可以现有补充,但不是全部替换,那就需要解决一个问题...进行选择更为开放的替换方案:本次重构开放了Winform/WPF运行容器的快速启动窗体、登录对话框、Banner条、关于圣诞框、启始页的直接替换方案,开发者可以自由制作这五个窗体或控件,通过资源配置,运行期动态替换...改进并增加了新的ORM支撑         AgileEAS.NET2005年提供了一个简单的ORM支撑开始,一直提供着一套类似于表格===》行这种模式的ORM技术,原有ORM体系中提供着两个核心的接口...改进并增加了新的Orm技术         AgileEAS.NET2005年提供了一个简单的ORM支撑开始,一直提供着一套类似于表格===》行这种模式的ORM技术,原有ORM体系中提供着两个核心的接口...Orm提供linq支持,Linq to EAS.NET         本次重构提供了一个开发人员非常喜欢的东西,AgileEAS.NET平台中的Orm提供了对Linq技术的支持,即llinq 2 eas.net

1K50

C#规范整理·集合和Linq

正文开始! 前言#   C#中的集合表现为数组和若干集合类。不管是数组还是集合类,它们都有各自的优缺点。如何使用好集合是我们在开发过程中必须掌握的技巧。...内存使用的角度来讲,数组在创建时被分配了一段固定长度的内存。...如果集合的数目固定并且不涉及转型,使用数组效率高,否则就使用List<T>(该使用数组的时候,还是要使用数组) 顺序存储结构,即线性表。线性表可动态地扩大和缩小,它在一片连续的区域中存储数据元素。...11.使用匿名类型存储LINQ查询结果(最佳搭档)# .NET 3.0开始,C#开始支持一个新特性:匿名类型。匿名类型由var、赋值运算符和一个非空初始值(或以new开头的初始化项)组成。...我们知道LINQ查询功能上来讲实际上可分为三类:LINQ to OBJECTS、LINQ to SQL、LINQ to XML(本建议不讨论)。

17230

Entity Framework 的一些性能建议

因此使用微信重新推送,希望能帮到大家。 自从我用了EF,每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。...比如这种情况: 我需要知道一篇文章的点击数,仅此而已,我可能会写: context.Post.FirstOrDefault(p => p.Id == postId).Hits; 或者: context.Post.Find...如果你只是想根据条件选择其中一些数据,而非全部的话,那ToList()以后再筛选,就是内存里执行了,并不是把你的条件转换成sql的where语句去执行。.... // 建立查询,但不执行 var result = query.ToList(); // 立即执行查询 所以,你应当尽量避免ToList()后的结果中再去查找自己想要的元素。 ?...所以文章一开始我就建议大家多用SQL Profiler看看自己的LINQ是怎么执行的。 如果把返回类型换成IQueryable,那么你的where语句就可以转化为SQL执行。

1.7K30

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分

微软 Visual Stuido .NET 的产品经理 Tony Goodhew 在一次访谈中说过,微软的研究表明越来越多的人倾向于在编程中使用2种或者更多的语言来工作。...我们尝试发现语法间的协同,我的意思是:这很难用语言来精确的形容。那我们来看看语言级别集成的LINQ查询吧。这个可扩展的模型是:我们采用方法调用的方式来实现这一点。...我知道我刚才是泛化的说明,你也可以使用 STL 来作基于模板的编程。标准模板库有他伟大的地方。我只是说,更广泛的背景上看C++写出的应用程序和用 VB 和 C# 写出的程序是应用于不同的目的的。...Osborn: 我知道一个人不能用C++来写托管代码。 Hejlsberg: 个人出发点来看,我也不会用它来写托管代码。但是,你要是让我来写一个编译器,这可不能是托管代码,那我还是会用C++的。...在现实世界里,我们越来越多的依赖运行中代码和动态行为的动态生成和检查,而Java 的泛型实现对我来说,是很大问题,他缺少程序运行时候的真实表现。

85231

只要十步,你就可以应用表达式树来优化动态调用

动态调用是在 .net 开发是时常遇到的一种需求,即在只知道方法名或者属性名等情况下动态的调用方法或者属性。最广为人知的一种实现方式就是使用 “反射” 来实现这样的需求。...使用表达式树创建委托进行动态调用所消耗的时间约为十分之一。 所以如果仅仅从性能上考虑,应该使用表达式树,也可以是用表达式树。...这里提供了一种最为简单的使用表达式进行动态调用的思路,如果可以写出一个静态方法(例如:ValidateCore)来表示动态调用的过程。...Init 方法中使用了 local function 从而实现了方法 “先使用后定义” 的效果。读者可以自上而下阅读,顶层开始了解整个方法的逻辑。...熟悉 goto 语法的开发者知道, goto 的时候需要使用 label 来标记想要 goto 的地方。而实际上,return 就是一种特殊的 goto。

54230

LINQ凭什么被誉为有史以来最好的技术?

image.png 今天来聊一下LINQ,这是笔者最喜欢的技术之一,在艰难时刻,它总能使笔者保持积极状态。如果对其一无所知,笔者敢肯定,经过讲解,你明天就会开始使用它。...许多强大的技术很难解释,但LINQ却并非如此:使用LINQ,便可以对常规编程集合(如列表或数组)运行SQL查询。 为什么它功能如此强大呢?...重写这样的内容需要花费很长时间,当尝试提出计数器变量和for循环中断时,甚至需要在Google上编辑或浪费大量精力思考。...现在是最后一个好处:实现LINQ基本上不费吹灰之力。你只需创建这个库并使用它。在五分钟之内,你就可以开始使用它了,这很神奇。它几乎可以用于任何集合,比如列表或数组。...LINQ总能以各种方式提供助力,有了它,笔者笑口常开。 队列中获取任务: task nextOpenTask = openTasks.FirstOrDefault(x => !

1.1K00
领券