Plugin(C#)
分派
AssignRequest assign = new AssignRequest();
assign.Assignee = prEntity["ownerid"] as EntityReference;
assign.Target = new EntityReference("new_budgetused", new_budgetusedId);
_service.Execute(assign);
共享
#region 插件中CRM共享共用方法
/// <summary>
/// 共享
/// </summary>
/// <param name="initentityName">要求共享的实体名称</param>
/// <param name="userId">要求共享的实体GUID</param>
/// <param name="entityName">指定共享的实体名称</param>
/// <param name="entityId">指定共享的实体GUID</param>
/// <param name="service">CRM组织服务</param>
private void ShareEntity(string initentityName, Guid userId, string entityName, Guid entityId, IOrganizationService service)
{
GrantAccessRequest grant = new GrantAccessRequest();
grant.PrincipalAccess = new PrincipalAccess
{
//读、写、附加等权限共享
AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess | AccessRights.AppendAccess,
Principal = new EntityReference(initentityName, userId)//共享给某个用户
};
grant.Target = new EntityReference(entityName, entityId);//要共享的对象
service.Execute(grant);
}
#endregion
取消共享
public void RevokeShareRecords(string LogicName,string targetEntityName,string usedAttrName, IOrganizationService service, Guid targetEntityId,string[] attrs,object[] values,string[] columnSet)
{
QueryByAttribute query = new QueryByAttribute(LogicName);
query.Attributes.AddRange(attrs);
query.Values.AddRange(values);
query.ColumnSet = new ColumnSet(columnSet);
EntityCollection userCollection = service.RetrieveMultiple(query);
foreach (Entity entity in userCollection.Entities)
{
//Guid AttrId = (Guid)entity.Attributes[SegmentInfo.SystemUserId];
Guid UserId = (Guid)entity.Attributes[usedAttrName];
EntityReference er = new EntityReference("systemuser", UserId);
RevokeAccessRequest revokeAccessRequest = new RevokeAccessRequest {
Revokee = new EntityReference("systemuser", UserId),
Target = new EntityReference(targetEntityName, targetEntityId)
};
service.Execute(revokeAccessRequest);
}
}
查询
string fetchxml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='" + objecttype + @"'>
<attribute name='new_name' />
<filter type='and'>
<condition attribute='statecode' operator='eq' value='0' />
<condition attribute='new_name' operator='eq' value='" + name + @"' />
</filter>
</entity>
</fetch>";
EntityCollection entityCollection = service.RetrieveMultiple(new FetchExpression(fetchxml));
获取最顶级的上下文,用于获取当前操作用户
public IPluginExecutionContext GetTopContext(IPluginExecutionContext currentContext)
{
IPluginExecutionContext topContext = currentContext;
for (int i = 0; i <= currentContext.Depth; i++)
{
if (topContext.ParentContext != null)
{
topContext = topContext.ParentContext;
}
}
return topContext;
}
获取sharepoint上的文档
public static DataCollection<Entity> RetrieveSharepointNotes(IOrganizationService service)
{
QueryExpression query = new QueryExpression("annotation")
{
//ColumnSet = new ColumnSet(true),
Criteria =
{
Filters =
{
new FilterExpression(LogicalOperator.Or)
{
Conditions =
{
new ConditionExpression("subject",ConditionOperator.Equal, "Attachment Error"),
},
Filters =
{
new FilterExpression(LogicalOperator.And)
{
Conditions =
{
new ConditionExpression("subject", ConditionOperator.Equal, "File Attachment"),
new ConditionExpression("notetext", ConditionOperator.Like, "http://spark.partners.extranet.microsoft.com%"),
}
}
}
}
}
}
};
EntityCollection ec = service.RetrieveMultiple(query);
return ec.Entities;
}
Query 转化为FetchXML/ FetchXML转化为Query
public static string ConvertQueryToFetchXml(QueryExpression query, IOrganizationService crmService)
{
QueryExpressionToFetchXmlRequest request = new QueryExpressionToFetchXmlRequest();
request.Query = query;
QueryExpressionToFetchXmlResponse response
= (QueryExpressionToFetchXmlResponse)crmService.Execute(request);
return response.FetchXml;
}
public static QueryExpression ConvertFetchXmlToQuery(string fetchXml, IOrganizationService crmService)
{
FetchXmlToQueryExpressionRequest fetchXmlRequest = new FetchXmlToQueryExpressionRequest();
fetchXmlRequest.FetchXml = fetchXml;
FetchXmlToQueryExpressionResponse fetchXmlResponse
= (FetchXmlToQueryExpressionResponse)crmService.Execute(fetchXmlRequest);
return fetchXmlResponse.Query;
}
获取optionset字段的显示名
//string name = GetPickListText("opportunity", "new_opportunitystate", 0, service);
public static string GetPickListText(string entityName, string attributeName, int optionSetValue, IOrganizationService service)
{
string AttributeName = attributeName;
string EntityLogicalName = entityName;
RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest();
retrieveDetails.EntityFilters = EntityFilters.All;
retrieveDetails.LogicalName = EntityLogicalName;
RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)service.Execute(retrieveDetails);
EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata;
PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, attributeName, StringComparison.OrdinalIgnoreCase)) as PicklistAttributeMetadata;
OptionSetMetadata options = picklistMetadata.OptionSet;
IList<OptionMetadata> picklistOption = (from o in options.Options where o.Value.Value == optionSetValue select o).ToList();
string picklistLabel = (picklistOption.First()).Label.UserLocalizedLabel.Label;
return picklistLabel;
}
改变记录的状态
public static void ChangeRecordState(IOrganizationService service, EntityReference entityMoniker, OptionSetValue state, OptionSetValue status)
{
SetStateRequest req = new SetStateRequest
{
EntityMoniker = entityMoniker,
State = state,
Status = status
};
service.Execute(req);
}
从template创建邮件
public static void CreateEmailFromTemplate(IOrganizationService service, EntityCollection sendFromCol, EntityCollection sendToCol, string emailSubject, string previewTriggerVaule, EntityReference regard, Guid contactId, Entity template, string btnOrder)
{
if (template != null)
{
// Use the InstantiateTemplate message to create an e-mail message using a template.
InstantiateTemplateRequest instTemplateReq = new InstantiateTemplateRequest
{
TemplateId = template.Id,
ObjectId = contactId,
ObjectType = "contact"
};
InstantiateTemplateResponse instTemplateResp = (InstantiateTemplateResponse)service.Execute(instTemplateReq);
Entity email = instTemplateResp.EntityCollection.Entities[0];
email.Attributes["new_campaigninvatationid"] = previewTriggerVaule;
email.Attributes["subject"] = emailSubject;
email.Attributes.Add("from", sendFromCol);
service.Create(email);
}
}
查询N:N记录
public static EntityCollection RetrieveNNRecords(IOrganizationService service, Guid ToEntityId, string FromEntity, string ToEntity, string RelationShip)
{
QueryExpression qe = new QueryExpression()
{
EntityName = FromEntity,
ColumnSet = new ColumnSet(true),
Criteria =
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("statecode",ConditionOperator.Equal,0)
}
},
LinkEntities =
{
new LinkEntity()
{
LinkFromEntityName = FromEntity,
LinkToEntityName = RelationShip,
LinkFromAttributeName = FromEntity+"id",
LinkToAttributeName = FromEntity+"id",
EntityAlias = RelationShip,
Columns = new ColumnSet(),
JoinOperator = JoinOperator.Inner,
LinkEntities =
{
new LinkEntity()
{
LinkFromEntityName = FromEntity,
LinkToEntityName = ToEntity,
LinkFromAttributeName = ToEntity+"id",
LinkToAttributeName = ToEntity+"id",
EntityAlias =ToEntity,
Columns = new ColumnSet(),
JoinOperator = JoinOperator.Inner,
LinkCriteria = new FilterExpression
{
Conditions =
{
new ConditionExpression
{
AttributeName = ToEntity+"id",
Operator = ConditionOperator.Equal,
Values = {
ToEntityId
}
}
}
}
}
}
}
}
};
return service.RetrieveMultiple(qe);
}
}
用户是否有指定的security role
public static bool UserHaveSpeficySecurityRole(IOrganizationService service, string roleName, Guid userID)
{
bool result = false;
QueryExpression query = new QueryExpression()
{
EntityName = "role",
ColumnSet = new ColumnSet(),
Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { newConditionExpression { AttributeName = "name", Operator = ConditionOperator.Equal, Values = { roleName } } } },
LinkEntities =
{
new LinkEntity
{
LinkFromEntityName = "role",
LinkFromAttributeName = "roleid",
LinkToEntityName = "systemuserroles",
LinkToAttributeName = "roleid",
LinkCriteria = new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression
{
AttributeName = "systemuserid",
Operator = ConditionOperator.Equal,
Values = { userID}
}
}
}
}
}
};
EntityCollection resultColl = service.RetrieveMultiple(query);
result = resultColl.Entities.Count > 0 ? true : false;
return result;
}
查询一条记录分派给哪些用户
public static List<EntityReference> RetrieveSharedPrincipalsAndAccess(IOrganizationService service, EntityReference entityRef)
{
try
{
var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
{
Target = entityRef
};
RetrieveSharedPrincipalsAndAccessResponse accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(accessRequest);
List<EntityReference> accessList = null;
if (accessResponse != null && accessResponse.PrincipalAccesses.Length > 0)
{
accessList = new List<EntityReference>();
for (int i = 0; i < accessResponse.PrincipalAccesses.Length; i++)
{
EntityReference accessOwner = accessResponse.PrincipalAccesses[i].Principal;
accessList.Add(accessOwner);
}
}
return accessList;
}
catch (Exception e)
{
throw new Exception("Customized Plugin RetrieveSharedPrincipalsAndAccess Error: " + e.Message);
}
}
拿到拥有指定security role的所有用户
public static ArrayList getUsersinRole(string Role_Name, IOrganizationService service)
{
ArrayList usersinrole = new ArrayList();
StringBuilder fetch2 = new StringBuilder();
fetch2.Append("<fetch mapping='logical' count='50' version='1.0'> ");
fetch2.Append(" <entity name='systemuser'>");
fetch2.Append(" <attribute name='fullname'/> ");
fetch2.Append(" <link-entity name='systemuserroles' to='systemuserid' from='systemuserid'> ");
fetch2.Append(" <link-entity name='role' to='roleid' from='roleid'> ");
fetch2.Append(" <filter> ");
fetch2.Append(" <condition attribute='name' operator='eq' value='" + Role_Name + "'/> ");
fetch2.Append(" </filter> ");
fetch2.Append(" </link-entity> ");
fetch2.Append(" </link-entity>");
fetch2.Append(" </entity> ");
fetch2.Append("</fetch>");
EntityCollection result = service.RetrieveMultiple(new FetchExpression(fetch2.ToString()));
foreach (var c in result.Entities)
{
usersinrole.Add(c.Attributes["fullname"].ToString());
}
return usersinrole;
}
判断用户是否是某团队的一员
public bool IsMemberInTeam(IOrganizationService service, Guid teamId, Guid memberId)
{
OrganizationServiceContext context = new OrganizationServiceContext(service);
var query = from relationship in context.CreateQuery("teammembership")
where relationship.GetAttributeValue<Guid>("teamid") == teamId
&& relationship.GetAttributeValue<Guid>("systemuserid") == memberId
select relationship;
return query.FirstOrDefault() != null;
}
添加用户到一个团队
OrganizationRequest request = new AddMembersTeamRequest { MemberIds = new Guid[] { user.Id }, TeamId = team.Id };
var response = service.Execute(request) as AddMembersTeamResponse;
C# 分页查询记录
public static void DoTest(IOrganizationService service)
{
// Query using the paging cookie.
// Define the paging attributes.
// The number of records per page to retrieve.
int fetchCount = 20;
// Initialize the page number.
int pageNumber = 1;
// Define the order expression to retrieve the records.
OrderExpression order = new OrderExpression();
order.AttributeName = "name";
order.OrderType = OrderType.Ascending;
// Create the query expression and add condition.
QueryExpression pagequery = new QueryExpression();
pagequery.EntityName = "opportunity";
// pagequery.Criteria.AddCondition(pagecondition);
pagequery.Orders.Add(order);
pagequery.ColumnSet.AddColumns();
// Assign the pageinfo properties to the query expression.
pagequery.PageInfo = new PagingInfo();
pagequery.PageInfo.Count = fetchCount;
pagequery.PageInfo.PageNumber = pageNumber;
// The current paging cookie. When retrieving the first page,
// pagingCookie should be null.
pagequery.PageInfo.PagingCookie = null;
while (true)
{
// Retrieve the page.
EntityCollection results = service.RetrieveMultiple(pagequery);
if (results.Entities != null)
{
for (int i = 0; i < results.Entities.Count;i++ )
{
Console.WriteLine(" {0} {1}", results.Entities[i].Id, i + 1);
}
}
// Check for more records, if it returns true.
if (results.MoreRecords)
{
// Increment the page number to retrieve the next page.
pagequery.PageInfo.PageNumber++;
// Set the paging cookie to the paging cookie returned from current results.
pagequery.PageInfo.PagingCookie = results.PagingCookie;
}
else
{
// If no more records are in the result nodes, exit the loop.
break;
}
}
}
更新用户所在的业务部门
SetBusinessSystemUserRequest req = new SetBusinessSystemUserRequest();
req.BusinessId = Guid.Parse("52A18602-09B8-E511-80C2-807DB137DB06"); BU的GUID
req.UserId = Guid.Parse("7F038A46-5BB4-E511-80C6-DD48FB4179EC"); User的GUID
req.ReassignPrincipal = new EntityReference("systemuser", Guid.Parse("7F038A46-5BB4-E511-80C6-DD48FB4179EC")); User的GUID
service.Execute(req);