Microsoft CRM 3.0 Web Service Calls With Generic Methods
Sep 07th 2007 | Posted by Kadir Pekel as .NET
While working in my cms project, my dirty code pushed me some refactoring for Microsoft Crm 3.0 web service calls. So i decided to write one wrapper class for accessing crm. If you worked with crm web services i guess that you’d probably tired of writing queries with QueryExpression and QueryByAttribute classes.
Since, when an idea of using generic methods blinked above by head, i began to code against BusinessEntity based classes of crm api. It was flowed like this:
public T[] FindEntities(string[] attributes, object[] values, ConditionOperator[] operators, string[] columns) where T : BusinessEntity
{
QueryExpression query = new QueryExpression();
ConditionExpression[] conditionExpressions = null;
if (attributes != null && values != null)
{
conditionExpressions = new ConditionExpression[attributes.Length];
for (int i = 0; i < conditionExpressions.Length; i++)
{
ConditionExpression conditionExpression = new ConditionExpression();
conditionExpression.AttributeName = attributes[i];
conditionExpression.Operator = operators == null ? ConditionOperator.Equal : operators[i];
conditionExpression.Values = new object[] { values[i] };
conditionExpressions[i] = conditionExpression;
}
}
FilterExpression filterExpression = new FilterExpression();
filterExpression.FilterOperator = LogicalOperator.And;
filterExpression.Conditions = conditionExpressions;
query.Criteria = filterExpression;
ColumnSetBase columnSet = null;
if (columns == null)
{
columnSet = new AllColumns();
}
else
{
columnSet = new ColumnSet();
((ColumnSet)columnSet).Attributes = columns;
}
query.ColumnSet = columnSet;
query.EntityName = typeof(T).Name;
BusinessEntityCollection result = _crmService.RetrieveMultiple(query);
T[] entities = new T[result.BusinessEntities.Length];
Array.Copy(result.BusinessEntities, entities, entities.Length);
return entities;
}
When finished base method, take it more easy by overriding it, below there are some more helper methods using base method
public T[] FindEntities<T>(string attribute, object value) where T : BusinessEntity
{
return FindEntities<T>(new string[] { attribute }, new object[] { value });
}
public T[] FindEntities<T>(string attribute, object value, ConditionOperator op) where T : BusinessEntity
{
return FindEntities<T>(new string[] { attribute }, new object[] { value }, new ConditionOperator[] { op });
}
public T[] FindEntities<T>(string attribute, object value, string[] columns) where T : BusinessEntity
{
return FindEntities<T>(new string[] { attribute }, new object[] { value }, columns);
}
public T[] FindEntities<T>(string attribute, object value, ConditionOperator op, string[] columns) where T : BusinessEntity
{
return FindEntities<T>(new string[] { attribute }, new object[] { value }, new ConditionOperator[] { op }, columns);
}
public T[] FindEntities<T>(string[] attributes, object[] values) where T : BusinessEntity
{
return FindEntities<T>(attributes, values, null, null);
}
public T[] FindEntities<T>(string[] attributes, object[] values, string[] columns) where T : BusinessEntity
{
return FindEntities<T>(attributes, values, null, columns);
}
public T[] FindEntities<T>(string[] attributes, object[] values, ConditionOperator[] operators) where T : BusinessEntity
{
return FindEntities<T>(attributes, values, operators, null);
}
And that’s it, don’t give up work and write some more helper overridings and improvements. For example it’s a good idea to write FindAll, FindEntity, FindEntityById and any CRUD methods. In my project my method calls looked like this instead of lines of code caused by QueryBase implementations.
public static account FindAccountOfUser(Guid contactId)
{
return Crm.Instance().FindEntity<account>("primarycontactid", contactId);
}
Finally my project code looks like more&more simplistic and clean. Please give me feedback for any improvements.
Subscribe in a reader
Subscribe via e-mail