Yar*_*veh 7 c# linq ienumerable linq-to-sql
编写自定义LINQ提供程序而不是编写实现IEnumerable的简单类有什么好处?
例如,这个问题显示了Linq2Excel:
var book = new ExcelQueryFactory(@"C:\Users.xls");
var administrators = from x in book.Worksheet<User>()
where x.Role == "Administrator"
select x;
Run Code Online (Sandbox Code Playgroud)
但是作为IEnumerable的"天真"实现的好处是什么?
Kei*_*thS 13
Linq提供程序的目的是将Linq表达式树(在查询的幕后构建)基本上"转换"为数据源的本机查询语言.如果数据已经在内存中,则不需要Linq提供程序; Linq 2对象很好.但是,如果您使用Linq与DBMS或云等外部数据存储进行通信,则绝对必要.
任何查询结构的基本前提是数据源的引擎应尽可能多地完成工作,并仅返回客户端所需的数据.这是因为假设数据源最好知道如何管理它存储的数据,并且因为数据的网络传输在时间上相对昂贵,因此应该最小化.现在,实际上,第二部分是"只返回客户要求的数据"; 服务器无法读懂您的程序并知道它真正需要什么; 它只能提供它的要求.这里是一个聪明的Linq提供商绝对打破了一个"天真"的实现.使用生成表达式树的Linq的IQueryable端,Linq提供程序可以将表达式树转换为,例如,DBMS将用于在Linq语句中返回客户端要求的记录的SQL语句.一个天真的实施将需要检索,以提供在内存中的对象到客户端列表中的所有使用一些宽泛的SQL语句的记录,然后过滤所有的工作,分组,排序等是由客户端来完成.
例如,假设您使用Linq通过其主键从DB中的表中获取记录.Linq提供程序可以转换dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()为"从MyObjectTable WHERE Id = 1234中选择SELECT TOP 1*".返回零或一条记录."天真"实现可能会向服务器发送查询"SELECT*FROM MyObjectTable",然后使用Linq的IEnumerable端(用于内存类)进行过滤.在一个声明中,您希望从包含1000万条记录的表中产生0-1结果,您认为哪些可以更快地完成工作(甚至可以完成工作,而不会耗尽内存)?
如果您只想foreach为了您的目的使用LINQ-to-Objects(即类似)功能,那么您不需要编写LINQ提供程序,这主要用于内存列表.
你也需要写一个LINQ提供程序,如果你想要分析查询表达式树为了它,翻译成别的东西,如SQL.您提到的ExcelQueryFactory似乎可以使用OLEDB-Connection.这可能意味着在查询数据时不需要将整个excel文件加载到内存中.
| 归档时间: |
|
| 查看次数: |
3117 次 |
| 最近记录: |