.NET中LINQ To Object和LINQ To SQL的区别

大家在编码过程中常常用到linq中LINQ To Object和LINQ To SQL,使用上来说好像差不多,傻傻分不清他们有啥区别。从字面字面意思上可以看出LINQ To Object跟Object有关系,而LINQ To SQL跟Sql有关系,事实上是这样吗?小编查阅了一些资料,他们有本质的区别。下面我们分别介绍他们的概念和区别。.

    首先了解一下什么是LINQ ,LINQ 是 Language Integrate Query 的缩写,它在对象和数据之间建立一种对应关系,可以使用访问内存对象的方式查询数据集合。从概念上来说,那么LINQ To SQL就是跟数据库建立对应关系,去操作数据库,而LINQ To Object是跟内存对象建立一种对关系。

一、LINQ To Object是什么?

    LINQ To Object封装了一些列的通用数据操作,直接将 LINQ 查询与任何 IEnumerable 或 IEnumerable<T> 集合一起使用。从根本上来讲LINQ To Object操作的数据源都在内存中。

二、LINQ To SQL是什么?

   LINQ To SQL是用Linq的方式去增删改查数据库中的数据。LINQ To SQL把关系数据库的数据模型映射到用开发人员所用的编程语言表示的对象模型,当执行查询时又会把对象中的模型语言集转换成Sql而完成数据库操作,当数据库返回结果时LINQ To SQL把数据转化成编程语言中的对象。

三、他们的区别

     LINQ To Object 返回的类型是IEnumerable ,数据已经在内存里,可以用迭代器迭代。LINQ To SQL返回的IQueryable类型,数据在数据库里面,真需要数据的时候才去解析sql和执行sql,比如tolist()或count()等操作,这样可以减轻数据库的使用压力。通常LinqToSql 和我们的ORM框架结合使用。 LINQ To Object 是把数据库中的数据放到内存中查询,它是基于内存的一系列筛选、选择、排序操作。他们的关系是IQueryable是继承自IEnumerable, IQueryable可以通过AsEnumerable方法转换成IEnumerable,转换后数据不会出现在内存,也只有使用时才会放到内存。从使用用途上来讲,他们有本质的区别。

来看看他们方法的实现,我们这里以where为例:

//这是LINQ To Object public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);//这是LINQ To Sqlpublic static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

可以看出IEnumerable类型的实现并不是表达式目录树而是用一个委托来实现的。

    除了LINQ To SQL还有LINQ To XML,LINQ To Excel,微软.net的目标是LINQ To Everything。

结语

    本文介绍了LINQ To Object和LINQ To SQL的区别。大家在使用上不用纠结转换问题,根据情况来定,比如涉及需要关联查询就不能执行Tolist()等函数,关联完成后再执行ToList()等操作。

    写作水平有限,欢迎大家斧正, 希望本文对大家学习和工作有一定参考价值,谢谢大家的支持。