C# 使用Odata检索集合
我正在尝试根据Silverlight控件中的Dynamics CRM中的Id检索一组实体 我不知道查询将返回多少个实体,但CRMs Rest服务每页只返回50条记录。因此,您必须不断构建集合,直到没有页面可供检索为止 我一直在试图找出如何让主页知道检索已完成,并且没有可供检索的记录。理想情况下,我希望能够做到:C# 使用Odata检索集合,c#,silverlight,silverlight-4.0,dynamics-crm,odata,C#,Silverlight,Silverlight 4.0,Dynamics Crm,Odata,我正在尝试根据Silverlight控件中的Dynamics CRM中的Id检索一组实体 我不知道查询将返回多少个实体,但CRMs Rest服务每页只返回50条记录。因此,您必须不断构建集合,直到没有页面可供检索为止 我一直在试图找出如何让主页知道检索已完成,并且没有可供检索的记录。理想情况下,我希望能够做到: var opps = _crmManager.RetrieveOpportunities(accountId) foreach (var opp in opps) { //do
var opps = _crmManager.RetrieveOpportunities(accountId)
foreach (var opp in opps)
{
//do stuff here
}
我甚至不确定在这种情况下这是否可能。
如果这是不可能的,我猜我将不得不这样做:
_crmManager.OpportunitiesLoaded += OpportunitiesLoaded
private void OpportunitiesLoaded(sender s, EventArgs e)
{
foreach (var opp in _crmManager.Opportunities)
{
//Do work here
}
}
如果是这种情况,我如何判断何时已完全检索实体并触发事件
到目前为止,我已经建立了以下机制:
//CrmManager.cs
private DataServiceCollection<Opportunity> _opportunity;
public DataServiceCollection<Opportunity> Opportunities
{
get { return _opportunity; }
set { _opportunity= value; }
}
public void RetrieveOpportunities(Guid accountId)
{
try
{
DataServiceQuery<Opportunity> query = (DataServiceQuery<Opportunity>)_context.OpportunitySet
.AddQueryOption("$filter", "AccountId/Id eq guid'" + accountId + "'");
query.BeginExecute(ProcessPages<Opportunity>, new PagingContext<Opportunity>()
{
ServiceContext = _context,
Query = query,
PageProcessor = delegate(DataServiceCollection<Opportunity> results)
{
try
{
if (null == Opportunities)
{
Opportunities= new DataServiceCollection<Opportunity>(_context);
Opportunities.Load(results);
}
else
{
for (int i = 0; i < results.Count; i++)
{
Opportunities.Add(results[i]);
}
}
}
catch (Exception ex)
{
//TODO catch
}
return true;
}
});
}
catch (SystemException ex)
{
//TODO Catch
}
}
//
private static void ProcessPages<T>(IAsyncResult result)
{
try
{
PagingContext<T> context = (PagingContext<T>)result.AsyncState;
QueryOperationResponse<T> response;
if (null == context.Query)
{
response = (QueryOperationResponse<T>)context.ServiceContext.EndExecute<T>(result);
}
else
{
response = (QueryOperationResponse<T>)context.Query.EndExecute(result);
context.Query = null;
}
DataServiceCollection<T> results = new DataServiceCollection<T>(response);
if (null != context.PageProcessor && !context.PageProcessor(results))
{
//Stop processing
return;
}
DataServiceQueryContinuation<T> token = results.Continuation;
if (null == token)
{
return;
}
context.ServiceContext.BeginExecute(token, ProcessPages<T>, context);
}
catch (Exception ex)
{
throw ex;
}
}
问题是,这在某些时候是有效的。有时,Opportunities集合有一些(不是全部)项,它将对这些项起作用。其他时候,当我尝试访问它时,它仍然是空的
我们将非常感谢您向正确的方向提供的任何帮助或推动。我找不到一种方法来实现我的愿望: 因此,当集合被填充时,我最终触发了一个事件。 我将其添加到CrmManager类中:
public delegate void CrmManagerEventHandler(object sender, EventArgs e);
public event CrmManagerEventHandler OpportunitiesPopulated;
然后在同一类中的RetrieveOpportunities方法中:
if ((results.Continuation == null) && (OpportunitiesPopulated!= null))
{
OpportunitiesPopulated(this, e);
}
然后在MainWindow.xaml.cs中,我订阅了该活动,以完成我想做的工作。在MainWindow.xaml.cs的设置中:
_manager.OpportunitiesPopulated += OpportunitiesPopulated;
而实际的方法是:
private void OpportunitiesPopulated(object sender, EventArgs e)
{
//Do all the work here
}
只有当机会主义者完成了我需要发生的事情时,这才发生
_manager.OpportunitiesPopulated += OpportunitiesPopulated;
private void OpportunitiesPopulated(object sender, EventArgs e)
{
//Do all the work here
}