2012-12-06 26 views
0

我正在构建CRM 2011的Silverlight应用程序,我想知道从CRM系统中检索数据的最佳方式是什么。查询Silverlight中的CRM数据

我已经链接到我的组织作为服务参考,并且能够访问它。我已经看到了一些检索数据的不同方法,但它们看起来都很复杂。有没有什么像我们可以在插件中使用的东西,比如获取XMl查询或简单的Service.Retrieve方法?

感谢

+0

当您尝试使用服务时。检索电话,会发生什么?你有错误吗? – Daryl

+0

您的Silverlight应用程序是否被部署为WebResource? – Nicknow

+0

我还没有真正尝试过放入service.retrieve,但我不确定所需的引用或代码是否与插件相同。是的,我打算用丝带按钮弹出它 – jimminybob

回答

0

我会建议你使用Silvercrmsoap,这是非常容易使用。我在Silverlight项目中使用了这个。

1

如果您为项目添加服务引用,则可以使用LINQ来查询数据集。 您可以从自定义区域下的Developer Resources下载CSDL。

private FelineSoftContext context; 
private System.String serverUrl; 
private DataServiceCollection<SalesOrder> _orders; 

public MainPage() 
    { 
     InitializeComponent(); 
     serverUrl = (String)GetContext().Invoke("getServerUrl"); 
     //Remove the trailing forward slash returned by CRM Online 
     //So that it is always consistent with CRM On Premises 
     if (serverUrl.EndsWith("/")) 
      serverUrl = serverUrl.Substring(0, serverUrl.Length - 1); 

     Uri ODataUri = new Uri(serverUrl + "/xrmservices/2011/organizationdata.svc/", UriKind.Absolute); 
     context = new FelineSoftContext(ODataUri) { IgnoreMissingProperties = true }; 

     var orders = from ord in context.SalesOrderSet 
        orderby ord.Name 
        select new SalesOrder 
        { 
         Name = ord.Name, 
         SalesOrderId = ord.SalesOrderId 
        }; 

     _orders = new DataServiceCollection<SalesOrder>(); 
     _orders.LoadCompleted += _orders_LoadCompleted; 
     _orders.LoadAsync(orders); 
    } 

    void _orders_LoadCompleted(object sender, LoadCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      if (_orders.Continuation != null) 
      { 
       _orders.LoadNextPartialSetAsync(); 
      } 
      else 
      { 
       OrderLookup.ItemsSource = _orders; 
       OrderLookup.DisplayMemberPath = "Name"; 
       OrderLookup.SelectedValuePath = "Id"; 
      } 
     } 
    } 

您还需要在类中添加一个方法如下:

private static ScriptObject GetContext() 
    { 
     ScriptObject xrmProperty = (ScriptObject)HtmlPage.Window.GetProperty("Xrm"); 
     if (null == xrmProperty) 
     { 
      //It may be that the global context should be used 
      try 
      { 

       ScriptObject globalContext = (ScriptObject)HtmlPage.Window.Invoke("GetGlobalContext"); 

       return globalContext; 
      } 
      catch (System.InvalidOperationException) 
      { 
       throw new InvalidOperationException("Property \"Xrm\" is null and the Global Context is not available."); 
      } 

     } 

     ScriptObject pageProperty = (ScriptObject)xrmProperty.GetProperty("Page"); 
     if (null == pageProperty) 
     { 
      throw new InvalidOperationException("Property \"Xrm.Page\" is null"); 
     } 

     ScriptObject contextProperty = (ScriptObject)pageProperty.GetProperty("context"); 
     if (null == contextProperty) 
     { 
      throw new InvalidOperationException("Property \"Xrm.Page.context\" is null"); 
     } 

     return contextProperty; 
    } 

您将需要添加额外的类库,并把其中的下面的代码。更改类名以匹配您导出的上下文:

partial class FelineSoftContext 
{ 

    #region Methods 
    partial void OnContextCreated() 
    { 
     this.ReadingEntity += this.OnReadingEntity; 
     this.WritingEntity += this.OnWritingEntity; 
    } 
    #endregion 

    #region Event Handlers 
    private void OnReadingEntity(object sender, ReadingWritingEntityEventArgs e) 
    { 
     ODataEntity entity = e.Entity as ODataEntity; 
     if (null == entity) 
     { 
      return; 
     } 

     entity.ClearChangedProperties(); 
    } 

    private void OnWritingEntity(object sender, ReadingWritingEntityEventArgs e) 
    { 
     ODataEntity entity = e.Entity as ODataEntity; 
     if (null == entity) 
     { 
      return; 
     } 

     entity.RemoveUnchangedProperties(e.Data); 
     entity.ClearChangedProperties(); 
    } 
    #endregion 
} 

public abstract class ODataEntity 
{ 
    private readonly Collection<string> ChangedProperties = new Collection<string>(); 

    public ODataEntity() 
    { 
     EventInfo info = this.GetType().GetEvent("PropertyChanged"); 
     if (null != info) 
     { 
      PropertyChangedEventHandler method = new PropertyChangedEventHandler(this.OnEntityPropertyChanged); 

      //Ensure that the method is not attached and reattach it 
      info.RemoveEventHandler(this, method); 
      info.AddEventHandler(this, method); 
     } 
    } 

    #region Methods 
    public void ClearChangedProperties() 
    { 
     this.ChangedProperties.Clear(); 
    } 

    internal void RemoveUnchangedProperties(XElement element) 
    { 
     const string AtomNamespace = "http://www.w3.org/2005/Atom"; 
     const string DataServicesNamespace = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 
     const string DataServicesMetadataNamespace = DataServicesNamespace + "/metadata"; 

     if (null == element) 
     { 
      throw new ArgumentNullException("element"); 
     } 

     List<XElement> properties = (from c in element.Elements(XName.Get("content", AtomNamespace) 
               ).Elements(XName.Get("properties", DataServicesMetadataNamespace)).Elements() 
            select c).ToList(); 

     foreach (XElement property in properties) 
     { 
      if (!this.ChangedProperties.Contains(property.Name.LocalName)) 
      { 
       property.Remove(); 
      } 
     } 
    } 

    private void OnEntityPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (!this.ChangedProperties.Contains(e.PropertyName)) 
     { 
      this.ChangedProperties.Add(e.PropertyName); 
     } 
    } 
    #endregion 
}