می خواهم از وب سرویس CRM برای کار با CRM استفاده کنم. علت این امر به خاطر این است که از داخل یک event receiver مربوط به شیرپونت میخواهم یک رکوردی را در CRM تغییر دهم

متد من:

 public void GetEntityByField(string entityName, string[] columns, string attributeName,string value)

        {

            using (OrganizationServiceClient client = new OrganizationServiceClient("CustomBinding_IOrganizationService", new EndpointAddress(this.ServiceUrl)))

            {

               

                ApplyCredentials(client, this.Credential);

 

                QueryExpression query = new QueryExpression();

                query.EntityName = entityName;

                query.ColumnSet = this.GetColumnSet(columns);

 

                ConditionExpression condition = new ConditionExpression();

                condition.AttributeName = attributeName;

                condition.Operator = ConditionOperator.Equal;

                condition.Values = new object[] { value };

 

                FilterExpression filter = new FilterExpression();

                filter.Conditions = new ConditionExpression[] { condition };

 

                query.Criteria = filter;

 

                EntityCollection response = client.RetrieveMultiple(query);

                Entity[] entities = response.Entities;

                if (entities.Length == 1)

                {

 

 

                }

            }

        }

 

متن خطا هنگامی که میخواهم RetrieveMultiple  را صدا بزنم:


 

Additional information: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://schemas.microsoft.com/xrm/2011/Contracts/Services:query. The InnerException message was 'The use of type 'Microsoft.Xrm.Sdk.Query.FilterExpression' as a get-only collection is not supported with NetDataContractSerializer.  Consider marking the type with the CollectionDataContractAttribute attribute or the SerializableAttribute attribute or adding a setter to the property.'.

 

 

سلام و عرض ادب،

به نظر مشکل در ساخت query شما باشد. برای تست مشخص کنید که آیا استفاده از FetchXML نیز باعث به وجود آمدن این مشکل می شود یا خیر؟ برای مثال از یک query به شکل زیر

string fetch2 = @" <fetch mapping='logical'> <entity name='account'> <attribute name='accountid'/> <attribute name='name'/> <link-entity name='systemuser' to='owninguser'> <filter type='and'> <condition attribute='lastname' operator='ne' value='Cannon' /> </filter> </link-entity> </entity> </fetch> ";

EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch))

استفاده کنید.

 

با سلام

چیزی که من متوجه شدم وقتی ColumnSet رو روی همه فیلدها میگذاشتم که برگرده همچین خطایی رو می دهد، متد من:

        private ColumnSet GetColumnSet(string[] columns)

        {

            ColumnSet columnSet = new ColumnSet();

            if (columns == null)

                columnSet.AllColumns = true;

            else

                columnSet.Columns = columns;

            return columnSet;

        }

 

که من این متد رو به متد زیر تغییر دادم و مشکلم بر طرف شد:

        private ColumnSet GetColumnSet(string[] columns, string entityName)

        {

            ColumnSet columnSet = new ColumnSet();

            if (columns == null)

            {

                columnSet.AllColumns = true;

                columnSet.Columns = new string[] { entityName + "id" };

            }

            else

                columnSet.Columns = columns;

            return columnSet;

        }

پس احتمالاً همون query بوده. ;)