C# 使用Odata检索集合

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

我正在尝试根据Silverlight控件中的Dynamics CRM中的Id检索一组实体

我不知道查询将返回多少个实体,但CRMs Rest服务每页只返回50条记录。因此,您必须不断构建集合,直到没有页面可供检索为止

我一直在试图找出如何让主页知道检索已完成,并且没有可供检索的记录。理想情况下,我希望能够做到:

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
}