Linq提供程序的目的是基本上将Linq表达式树(它们构建在查询的后面)转换为数据源的本地查询语言。在数据已经在内存中的情况下,您不需要Linq提供程序; Linq 2对象很好。但是,如果您正在使用Linq与外部数据存储(如DBMS或云)进行对话,则这是绝对必要的。
任何查询结构的基本前提是数据源的引擎应该尽可能地做大量的工作,并且只返回客户端需要的数据。这是因为数据源被假定为最好地知道如何管理其存储的数据,并且因为数据的网络传输在时间上相对昂贵,因此应该最小化。现在,实际上,第二部分是“仅返回客户请求的数据”;服务器不能读取你的程序的头脑,并知道它真的需要什么;它只能提供它的要求。这是一个智能的Linq提供者绝对会吹走一个“天真”的实现。使用生成表达式树的Linq的IQueryable端,Linq提供者可以将表达式树转换成SQL语句,DBMS将使用该语句返回客户端在Linq语句中要求的记录。一个幼稚的实现需要使用一些广泛的SQL语句来检索所有记录,以便向客户端提供内存对象列表,然后所有的筛选,分组,排序等工作都由客户端完成。
例如,假设您正在使用Linq从其主键的DB表中获取记录。一个Linq提供者可以将dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()
转换成“SELECT TOP 1 * from MyObjectTable WHERE Id = 1234”。这会返回零个或一个记录。一个“天真”的实现可能会向服务器发送查询“SELECT * FROM MyObjectTable”,然后使用Linq的IEnumerable端(对内存类起作用)进行过滤。在一份声明中,您希望从一张拥有1000万条记录的表格中产生0-1个结果,您认为哪些方法可以更快地完成这项工作(甚至可以工作,而不会耗尽内存)?
不确定为什么linq-to-excel从IQueryable中获利,但有些情况会使代码更快。 – CodesInChaos 2010-12-10 16:41:06