July
21st,
2012
上期回顾
在前两篇文章中(延迟加载与延迟求值查询、迭代器的妙用),介绍了很多延迟加载、延迟求值查询和迭代器的知识。
本文也是利用了相关技术,巧妙了实现了一个功能。
Salesforce API 的调用
最近会进行 Salesforce 开发,过程中需要在 C# 中调用 Salesforce 提供的 API。
Salesforce API 请求数据库的时候和执行 SQL 语句差不多,但是你没办法一下子读取到所有数据!
如果想要得到一张表中的所有数据,你只能这么读:
var qResult = connection.query("SELECT FirstName, LastName FROM Contact");
var qResult2 = connection.queryMore(qResult.getQueryLocator());
var qResult3 = connection.queryMore(qResult2.getQueryLocator());
这是最粗暴的读取方式,每次读取只能得到200条数据,如果想要更多的数据,必须利用上次返回结果里的一串字符串,然后就可以得到后面一批数据了。
笨办法就是用一个局部变量,每次查询结束后,把结果放进去,最后一起返回即可。
但这样内存中会有大量的数据,其实这里,也可以像上一篇文章那样,把细节封装起来!
利用迭代器封装细节
public IEnumerable<Contact> GetAllContact()
{
QueryResult results = null;
do
{
results = results == null ?
connection.query("SELECT FirstName, LastName FROM Contact"):
connection.queryMore(results.getQueryLocator());
foreach(var record in results.getRecords)
{
yield return record;
}
}while(!results.isDone())
}
思路很简单,直接进入一个 do-while 循环,如果是第一次就直接读取,如果不是第一次就利用上次的结果继续读取。
然后把数据用 yield return 返回即可。
最终,外部调用这个方法的时候,只要不用 ToList() 等方法,它是延迟加载+延迟求值查询的,并不会一次性读出所有的数据,性能非常棒!
本作品由 Dozer 创作,采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。