我正在使用Odata RESTful服务阅读Sharepoint列表数据(> 20000个条目),详见此处-http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/getting-started-using -the-OData兼容REST的API - 查询-A-SharePoint的list.aspx
我能够读取数据,但我只获得前1000条记录。我还检查了Sharepoint服务器上的List View Throttling设置为5000。请建议。
更新
@Turker:你的答案是现货!!非常感谢你。我能够在第一次迭代中获得前2000条记录。但是,我在while循环的每次迭代中获得相同的记录。我的代码如下 -
...initial code...
int skipCount =0;
while (((QueryOperationResponse)query).GetContinuation() != null)
{
//query for the next partial set of customers
query = dc.Execute<CATrackingItem>(
((QueryOperationResponse)query).GetContinuation().NextLinkUri
);
//Add the next set of customers to the full list
caList.AddRange(query.ToList());
var results = from d in caList.Skip(skipCount)
select new
{
Actionable = Actionable,
}; Created = d.Created,
foreach (var res in results)
{
structListColumns.Actionable = res.Actionable;
structListColumns.Created= res.Created;
}
skipCount = caList.Count;
}//Close of while loop
答案 0 :(得分:6)
您是否在Feed的末尾看到<link rel="next">
元素?
例如,如果你看一下
http://services.odata.org/Northwind/Northwind.svc/Customers/
你会看到
<link rel="next" href="http://services.odata.org/Northwind/Northwind.svc/Customers/?$skiptoken='ERNSH'" />
在Feed的末尾,这意味着服务正在实现服务器端分页,您需要发送
http://services.odata.org/Northwind/Northwind.svc/Customers/?$skiptoken='ERNSH'
查询以获取下一组结果。
答案 1 :(得分:0)
我没有看到您的代码有任何特别的错误。您可以尝试转储所请求的URL(从代码或使用fiddler之类的东西)来查看客户端是否真的发送相同的查询(从而获得相同的响应)。
在任何情况下,这是一个有效的示例代码(使用示例服务):
DataServiceContext ctx = new DataServiceContext(new Uri("http://services.odata.org/Northwind/Northwind.svc"));
QueryOperationResponse<Customer> response = (QueryOperationResponse<Customer>)ctx.CreateQuery<Customer>("Customers").Execute();
do
{
foreach (Customer c in response)
{
Console.WriteLine(c.CustomerID);
}
DataServiceQueryContinuation<Customer> continuation = response.GetContinuation();
if (continuation != null)
{
response = ctx.Execute(continuation);
}
else
{
response = null;
}
} while (response != null);
答案 2 :(得分:0)
我遇到了同样的问题,并希望它是一个通用的解决方案。 所以我使用GetAlltems方法扩展了DataServiceContext。
public static List<T> GetAlltems<T>(this DataServiceContext context)
{
return context.GetAlltems<T>(null);
}
public static List<T> GetAlltems<T>(this DataServiceContext context, IQueryable<T> queryable)
{
List<T> allItems = new List<T>();
DataServiceQueryContinuation<T> token = null;
EntitySetAttribute attr = (EntitySetAttribute)typeof(T).GetCustomAttributes(typeof(EntitySetAttribute), false).First();
// Execute the query for all customers and get the response object.
DataServiceQuery<T> query = null;
if (queryable == null)
{
query = context.CreateQuery<T>(attr.EntitySet);
}
else
{
query = (DataServiceQuery<T>) queryable;
}
QueryOperationResponse<T> response = query.Execute() as QueryOperationResponse<T>;
// With a paged response from the service, use a do...while loop
// to enumerate the results before getting the next link.
do
{
// If nextLink is not null, then there is a new page to load.
if (token != null)
{
// Load the new page from the next link URI.
response = context.Execute<T>(token);
}
allItems.AddRange(response);
}
// Get the next link, and continue while there is a next link.
while ((token = response.GetContinuation()) != null);
return allItems;
}