Артем, спасибо за совет.
А реализовал след. образом:
X++:
XmlDocument configDoc;
public AccountRetrieveMultipleHandler(string unsecureConfig, string secureConfig)
{
configDoc = new XmlDocument();
configDoc.LoadXml(unsecureConfig);
}
#region IPlugin Members
public void Execute(IPluginExecutionContext context)
{
if (context.Depth > 1)
return;
XmlDocument inDoc = new XmlDocument();
inDoc.LoadXml((string)context.InputParameters.Properties["FetchXml"]);
string enityName = inDoc.SelectSingleNode("fetch/entity/@name").InnerText;
if (enityName == "account")
{
ICrmService serv = context.CreateCrmService(true);
// Create a QueryExpression.
QueryExpression qe = new QueryExpression();
qe.EntityName = "role";
qe.ColumnSet = new AllColumns();
// Set up the join between the role entity
// and the intersect table systemuserroles.
LinkEntity le = new LinkEntity();
le.LinkFromEntityName = "role";
le.LinkFromAttributeName = "roleid";
le.LinkToEntityName = "systemuserroles";
le.LinkToAttributeName = "roleid";
// Set up the join between the intersect table
// systemuserroles and the systemuser entity.
LinkEntity le2 = new LinkEntity();
le2.LinkFromEntityName = "systemuserroles";
le2.LinkFromAttributeName = "systemuserid";
le2.LinkToEntityName = "systemuser";
le2.LinkToAttributeName = "systemuserid";
// The condition is to find the user ID.
//Microsoft.Crm.Sdk.Query.c
ConditionExpression ce = new ConditionExpression();
ce.AttributeName = "systemuserid";
ce.Operator = ConditionOperator.Equal;
ce.Values = new object[] { context.UserId };
FilterExpression fe = new FilterExpression();
fe.AddCondition(ce);
le2.LinkCriteria = fe;
le.LinkEntities.Add(le2);
qe.LinkEntities.Add(le);
// Execute the query.
BusinessEntityCollection bec = serv.RetrieveMultiple(qe);
string rolename = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@securityrole").InnerText;//"Системный администратор";
bool roleFound = false;
if (bec.BusinessEntities.Count > 0)
{
for (int i = 0; i < bec.BusinessEntities.Count; i++)
{
if (rolename == ((role)bec.BusinessEntities[i]).name)
roleFound = true;
}
}
if (!roleFound)
{
XmlElement conditionElem;
XmlAttribute conditionAttr;
conditionElem = inDoc.CreateElement("condition");
conditionAttr = inDoc.CreateAttribute("attribute");
conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@attribute").InnerText;//"customertypecode";
conditionElem.Attributes.Append(conditionAttr);
conditionAttr = inDoc.CreateAttribute("operator");
conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@operator").InnerText;//"ne";
conditionElem.Attributes.Append(conditionAttr);
conditionAttr = inDoc.CreateAttribute("value");
conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@value").InnerText;//"3";
conditionElem.Attributes.Append(conditionAttr);
inDoc.SelectSingleNode("fetch/entity/filter").AppendChild(conditionElem);
context.InputParameters.Properties["FetchXml"] = inDoc.OuterXml;
}
}
}
#endregion