打造自己的LINQ Provider(中):IQueryable和IQueryProvider

概述

在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate、LINQ to Google等,大有“一切皆LINQ”的 趋势。LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider。

本文为打造自己的LINQ Provider系列文章第二篇,主 要详细介绍自定义LINQ Provider中两个最重要的接口IQueryable和 IQueryProvider。

IEnumerable<T>接口

在上一篇打造自己 的LINQ Provider(上):Expression Tree揭秘》一文的最后,我说到了这样一 句话:需要注意的是LINQ to Objects并不需要任何特定的LINQ Provider,因为 它并不翻译为表达式目录树,带着这个问题,我们先来看下面这段代码,查询的 结果query为IEnumerable<String>类型:

static void Main(string[] args)
{
  List<String> myList = new List<String>() { "a", "ab", "cd", "bd" };
  IEnumerable<String> query = from s in myList
        where s.StartsWith("a")
         select s;
  foreach (String s in query)
   {
    Console.WriteLine(s);
  }
  Console.Read ();
}

这里将返回两条结果,如下图所示:


这里就有一个问题,为什么在LINQ to Objects中返回的是 IEnumerable<T>类型的数据而不是IQueryable<T>呢?答案就在本 文的开始,在LINQ to Objects中查询表达式或者Lambda表达式并不翻译为表达 式目录树,因为LINQ to Objects查询的都是实现了IEnmerable<T>接口的 数据,所以查询表达式或者Lambda表达式都可以直接转换为.NET代码来执行,无 需再经过转换为表达式目录这一步,这也是LINQ to Objects比较特殊的地方, 它不需要特定的LINQ Provider。我们可以看一下IEnumerable<T>接口的 实现,它里面并没有Expression和Provider这样的属性,如下图所示:

时间: 2024-11-02 00:05:59

打造自己的LINQ Provider(中):IQueryable和IQueryProvider的相关文章

打造自己的LINQ Provider(上):Expression Tree揭秘

概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate.LINQ to Google等,大有"一切皆LINQ"的 趋势.LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider. 本文为打造自己的LINQ Provider系列文章第一篇,主 要介绍表达式目录树(Expression Tree)

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

阅读目录: 1.开篇介绍 2.扩展Linq to Object (应用框架具有查询功能) 2.1.通过添加IEnumerable<T>对象的扩展方法 2.2.通过继承IEnumerable<T>接口 2.3.详细的对象结构图 3.实现IQueryable<T> .IQueryProvider接口 3.1.延迟加载IEnumertor<T>对象(提高系统性能) 3.2.扩展方法的扩展对象之奥秘(this IQueryable<TSource> so

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

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

Linq语法中,where 条件写一个&amp;amp;amp; 和 两个&amp;amp;amp; 有什么区别吗?

问题描述 如题 解决方案 解决方案二:这里的&应该就是C#的语法吧.&按位与&&逻辑与解决方案三:&&对应sql语句中是and如select*fromuserwhereu.Id=1andu.name='Tim'linq:fromuinuserwhereu.Id==1&&u.name=="Tim"一个&:按位与linq语句中一般用不到吧...解决方案四:引用2楼的回复: &&对应sql语句中是and如

SharePoint 2010 RBS FILESTREAM Provider中的垃圾收集

在以前的博客中,我曾经介绍过如何在SharePoint 2010系统中安装和配置RBS FILESTREAM Provider,实现将SharePoint中的文件存储到磁盘文件系统中.但是当用户在SharePoint中上载文件时,文件的二进制内容就会通过RBS FILESTREAM Provider,写入到指定的磁盘文件夹之中.通过RBS可以极大的提高SharePoint存储文件的能力,也有效的使SharePoint的内容数据库不会跟着文件数量的增多而不断膨胀. 但是当用户从SharePoint

PS打造奇妙景观透明气泡中的海底世界数码合成教程

通过不同的物品组合,通过后期奇妙的手法结合,会得到一个惊喜之作. 以下这些是制作中使用到的素材图片: *photoshop教程最终的效果图 制作步骤: 1. 在photoshop中打开气泡的素材图,并将水波的素材置入到工作空间内. 2. 使用Ctrl+T命令将水波层变形成如下效果(不需要的部分可以使用橡皮擦工具擦除掉) 3. 将水波层的图层模式调整为柔光. 4. 把红色球体的素材置入到工作空间,调整到合适大小和位置后,并将黑色束带和白色圆环抠出,其余部分删除. 5. 把白色圆环部分单独抠出并和黑

Linq查询中类型的转化以及序列化XXX对象时检测到循环引用

  我有一个Studen类型,有5个字段,num,name,birth,idcard,classId,我们一般写Linq查询的时候就是这样写 List<Student> stus =  from Student s in dc.Student select s;   那么其实我只想用其中的两个字段num,name,我就需要写一个dto StudentDto: num,name List<Student> stus =  from Student s in dc.Student   

艾伟_转载:打造优雅的Linq To SQL动态查询

首先我们来看看日常比较典型的一种查询Form 这个场景很简单:就是根据客户名.订单日期.负责人来作筛选条件,然后找出符合要求的订单. 在那遥远的时代,可能避免不了要写这样的简单接口: public interface IOrderService{ IList<Order> Search(string customer, DateTime dateFrom, DateTime dateTo, int employeeID);} 具体爱怎么实现就怎么实现啦,存储过程,ORM框架.这里假定是用了孩童

关于system.linq.dynamic中 NorthWindDataContext 实现ling动态语句的查询

问题描述 类似于图片上的写法,使用NorthWindDataContext这个是类是怎么写的?帮忙写个实例..谢谢各位了!qq617284237email:woshixuleijava@163.com 解决方案 解决方案二:p="id=100"GetProject(stringp){sql=...+'where'+p}用expression表达式的话p=project=>project.id=100GetProject(Expression<Func<Project,