4

Dynamics CRM 2011 から systemuser 情報を取得しようとしているときにエラーが発生しました。次のコードが機能します。

public List<CrmUser> GetAllCrmUsers()
{
    List<CrmUser> CrmUsers = new List<CrmUser>();
    using (CrmSdk.OrganizationServiceClient myCrm = new CrmSdk.OrganizationServiceClient("CustomBinding_IOrganizationService1"))
    {
        try
        {

            // this will need to be changed... the address to a key in the app.config and the credentials will need to be whatever is correct for the
            // end server to hit the CRM WCF service
            myCrm.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://devcrm.removed/XRMServices/2011/Organization.svc");
            myCrm.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;


            CrmSdk.ColumnSet colsPrincipal = new CrmSdk.ColumnSet();

            colsPrincipal.Columns = new string[] { "lastname", "firstname", "domainname", "systemuserid" };

            CrmSdk.QueryExpression queryPrincipal = new CrmSdk.QueryExpression();
            queryPrincipal.EntityName = "systemuser";
            queryPrincipal.ColumnSet = colsPrincipal;

            CrmSdk.EntityCollection myAccounts = myCrm.RetrieveMultiple(queryPrincipal);

            foreach (CrmSdk.Entity myEntity in myAccounts.Entities)
            {
                //create new crm users and add it to the list
                CrmUser thisOne = new CrmUser();

                thisOne.firstName = myEntity.Attributes[0].Value.ToString();
                thisOne.lastName = myEntity.Attributes[1].Value.ToString();
                thisOne.userId = myEntity.Attributes[2].Value.ToString();
                thisOne.userGuid = myEntity.Attributes[3].Value.ToString();

                CrmUsers.Add(thisOne);

            }


        }

        catch (Exception ex)
        {
            CrmUser thisOne = new CrmUser();
            thisOne.firstName = "Crap there was an error";
            thisOne.lastName = ex.ToString();
            CrmUsers.Add(thisOne);
        }
    }
    return CrmUsers;
}

ただし、サービスを呼び出すときに「businessunitid」を ColumnSet に追加しようとすると、次のエラーが表示されます。

「行 1 の位置 1879 にエラーがあります。要素 \ 2004/07/System.Collections.Generic:value\' には、名前 \'/xrm/2011/Contracts:OptionSetValue\' にマップされるタイプのデータが含まれています。この名前にマップされる型の知識。DataContractResolver の使用を検討するか、\'OptionSetValue\' に対応する型を既知の型のリストに追加します。たとえば、KnownTypeAttribute 属性を使用するか、既知の型のリストに追加します。 DataContractSerializer に渡されました。\'"

このエラーは、返されるデータがメタデータ情報によると「Lookup」タイプであるためです。[KnownType(typeof(OptionSetValue))]タグのすぐ下に追加しようとし[Data Contract]ましたが無駄でした。これを 2 日間グーグルとビンギング (?) しているので、既に回答されている場合はお詫びします。

4

2 に答える 2

0

やっと見つけました。自動生成された Reference.cs コードを開く必要があります。エンティティ クラスを検索します。

public partial class Entity : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

その上の行に移動し、既知のタイプのものを追加して、エンティティがそれを逆シリアル化できるようにします。

[System.Runtime.Serialization.KnownTypeAttribute(typeof(EntityReference))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(OptionSetValue))]
public partial class Entity : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
于 2013-10-17T20:42:03.243 に答える