抓住五一假期尾巴和小伙伴们一起分享这两者的区别、大家在日常编码的过程当中肯定也注意过或者使用过、但是二者其实存在本质的区别

1、什么是LinqToObject呢?

LINQ to Objects指直接将 LINQ 查询与任何 IEnumerable 或 IEnumerable<T> 集合一起使用,而不使用中间 LINQ 提供程序或 API,例如 LINQ to SQL 或 LINQ to XML。 简单来说它是一种操作的方式、方法,从根本上说,“LINQ to Objects”表示一种新的处理集合的方法。 采用旧方法,必须编写指定如何从集合检索数据的复杂的 foreach 循环。 而采用 LINQ 方法,只需编写描述要检索的内容的声明性代码。

2、什么是LinqToSQL呢?

LINQ to SQL 是 .NET Framework 版本3.5 的一个组件,它提供用于将关系数据作为对象管理的运行时基础结构。在 LINQ to SQL 中,关系数据库的数据模型映射到用开发人员所用的编程语言表示的对象模型。 当应用程序运行时,LINQ to SQL 会将对象模型中的语言集成查询转换为 SQL,然后将它们发送到数据库进行执行。 当数据库返回结果时,LINQ to SQL 会将它们转换回您可以用您自己的编程语言处理的对象。

3、二者区别

LinqToObject:返回的是IEnumerable类型,数据其实已经在内存里,有个迭代器的实现,参数用的是委托

LinqToSql:返回的IQueryable类型,数据在数据库里面,这个list里面有表达式目录树---返回值类型--IQueryProvider(查询的支持工具,sqlserver语句的生成),其实userList只是一个包装对象,里面有表达式目录树,有结果类型,有解析工具,还有上下文,真需要数据的时候才去解析sql,执行sql,拿到数据的

一、通常LinqToSql 和我们的ORM框架结合使用、其内部是一个表达式目录树(也叫二叉树)、也就是LinqToSql 通过表达式式目录树对其进行拼接后、拼接完成后一次性转换成SQL语句至数据库中查询、基于数据库查询

二、我们的LinqToObject是将我们数据一次性从数据库中查询出来并放置内存中、然后通过内存中的数据进行过滤、筛选出我们的目标数据、基于内存查询

以下不难看出IQueryable继承自IEnumerable 但是二者却有着本质的区别

    //
// 摘要:
// 提供针对特定数据源(其中数据类型未未知)评估查询的功能。
//
// 类型参数:
// T:
// 数据源中数据的类型。
public interface IQueryable<out T> : IEnumerable<T>, IEnumerable, IQueryable
{
}

这是IQueryable一些实现 包含表达式目录树Expression参数并内置委托

  //
// 摘要:
// Filters a sequence of values based on a predicate. Each element's index is used
// in the logic of the predicate function.
//
// 参数:
// source:
// An System.Linq.IQueryable`1 to filter.
//
// predicate:
// A function to test each element for a condition; the second parameter of the
// function represents the index of the element in the source sequence.
//
// 类型参数:
// TSource:
// The type of the elements of source.
//
// 返回结果:
// An System.Linq.IQueryable`1 that contains elements from the input sequence that
// satisfy the condition specified by predicate.
//
// 异常:
// T:System.ArgumentNullException:
// source or predicate is null.
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate);

这是IEnumerable类型一些实现 并不是表达式目录树仅仅是一个委托来实现

 1         //
2 // 摘要:
3 // Filters a sequence of values based on a predicate. Each element's index is used
4 // in the logic of the predicate function.
5 //
6 // 参数:
7 // source:
8 // An System.Collections.Generic.IEnumerable`1 to filter.
9 //
10 // predicate:
11 // A function to test each source element for a condition; the second parameter
12 // of the function represents the index of the source element.
13 //
14 // 类型参数:
15 // TSource:
16 // The type of the elements of source.
17 //
18 // 返回结果:
19 // An System.Collections.Generic.IEnumerable`1 that contains elements from the input
20 // sequence that satisfy the condition.
21 //
22 // 异常:
23 // T:System.ArgumentNullException:
24 // source or predicate is null.
25 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);

LinqToObject和LinqToSql的区别的更多相关文章

  1. 自己动手实现Expression翻译器 – Part I

    伴随.Net3.5到来的Expression,围绕着它产生了各种各样有趣的技术与应用,Linq to object.Linq to sql.Linq to sqllite.Linq to Anythi ...

  2. 动手实现Expression翻译器1

    动手实现Expression翻译器 – Part I   伴随.Net3.5到来的Expression,围绕着它产生了各种各样有趣的技术与应用,Linq to object.Linq to sql.L ...

  3. 有关linqtosql和EF的区别

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF对数据库架构和我们查询的类型实行了更好的解耦.使用EF,我们查询的对象不再 ...

  4. LinqToSql增加、修改、删除---(转载)

    LinqToSql ,EF:外键实体的CRD 2011-03-06 21:56:26|  分类: linq |  标签:编程  |字号 订阅           接触LinqTosql是很久的事情了, ...

  5. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  6. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  7. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  8. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  9. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

随机推荐

  1. 看完我的笔记不懂也会懂----MarkDown使用指南

    目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...

  2. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  3. day1_安装及建立数据库和表

    #第一份数据库及表create database library; use library; create table book( id int primary key, book_name char ...

  4. ThinkAdmin v6 未授权列目录/任意文件读取复现

    大佬的审计文章:https://github.com/zoujingli/ThinkAdmin/issues/244 任意文件读取 POC curl http://127.0.0.1/admin.ht ...

  5. WPF 基础 - 事件

    1. 前言 WPF 事件的路由环境是 UI 组件树,先来看看这棵树. 1.1 Logical Tree 和 Visual Tree WPF 中的树有两种,一颗是逻辑树,另一颗也是逻辑树. 开玩笑,WP ...

  6. python文件操作以及循环小结

    Python中的文件使用建议使用 with open(filename, "r") as f: 的形式进行文件操作,如果忘记关闭文件指针的话,他会帮你自己关闭文件, 如果使用原来的 ...

  7. Java学习历程记录(一)

    一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...

  8. pip软件包管理工具介绍及基本使用

    pip软件包管理工具介绍及基本使用 一分耕耘,一分收获,要收获得好,必须耕耘得好.-- 徐特立 一.pip软件包管理工具介绍: 定义:pip是Python包管理工具 作用:对Python包的查找.下载 ...

  9. PHP并发抢购解决方案

    Mysql版 逻辑步骤 mysql存储引擎使用Innodb 开始事务,查询商品库存并加上共享锁 判断库存是否足够,进行商品/订单/用户等操作 提交事务,完成下单抢购 代码参考 // 关闭自动提交 $t ...

  10. linux程序开机自动启动

    linux如果需要实现开机启动, 可以找到 $HOME/.config/autostart 目录(没有的话新建一个),在该文件夹下创建一个空文件,文件名自拟,后缀必须是desktop,如:dingda ...