CRM 2016 RetrieveMultiple插件用于过滤电子邮件

时间:2017-10-26 02:03:25

标签: c# linq plugins dynamics-crm dynamics-crm-2016

我要求将某些电子邮件标记为机密。除非您具有特定角色,否则这些电子邮件不应在CRM系统中可见。我创建了一个' Confidential'在电子邮件实体上标记并在电子邮件实体的RetrieveMultiple上创建一个插件,该插件会过滤掉所有包含“电子邮件”的电子邮件。 = true。

但是,电子邮件记录仍然可以在'活动'下看到。我在活动指针实体的retrievemultiple上创建了另一个插件,但是我无法创建一个显示所有活动(包括电子邮件)的查询,除了标记为' Confidential'的电子邮件。任何人都可以帮我解决这个问题吗?这就是我创造的

QueryExpression objQueryExpression1 = (QueryExpression)context.InputParameters["Query"];

objQueryExpression1.LinkEntities.Add(new LinkEntity("activitypointer", "email", "activityid", "activityid", JoinOperator.LeftOuter));

objQueryExpression1.LinkEntities[0].EntityAlias = "filteredemails";
objQueryExpression1.LinkEntities[0].LinkCriteria.AddCondition("csiro_confidential", ConditionOperator.Equal, true);

2 个答案:

答案 0 :(得分:1)

您好,您可以这样做,

QueryExpression objQueryExpression1 = (QueryExpression)context.InputParameters["Query"];

                if (objQueryExpression1.EntityName == "email")
                {
                    objQueryExpression1.Criteria = new FilterExpression(LogicalOperator.And)
                    {
                        Conditions =
                        {
                            new ConditionExpression("new_confidential",ConditionOperator.NotEqual,true)
                        }
                    };
                }
                else if (objQueryExpression1.EntityName == "activitypointer")
                {
                    QueryExpression e = new QueryExpression("email")
                    {
                        Criteria = new FilterExpression(LogicalOperator.And)
                        {
                            Conditions =
                            {
                                new ConditionExpression("csiro_confidential",ConditionOperator.NotEqual,true)
                            }
                        }
                    };

                    var filteredOutEmails = service.RetrieveMultiple(e).Entities.Select(xc => xc.Id.ToString()).ToArray();

                    objQueryExpression1.Criteria.AddCondition("activityid", ConditionOperator.NotIn,filteredOutEmails);

                }
                context.InputParameters["Query"] = objQueryExpression1;  
  

电子邮件 activitypointer 实体注册您的插件   使用同步模式进行预操作

屏幕截图附件enter image description here

答案 1 :(得分:0)

这是一个带有ActivityPointer的known behavior,因为您创建的自定义属性(过滤器)专用于一种类型的活动。即你的情况下的电子邮件。

在电子邮件视图或仅与电子邮件相关的查询中,这很有效。其他活动不了解此自定义属性& ActivityPointer也是如此。

您必须为individual activity类型执行OUTERJOIN(您在系统中使用的是什么?)&撰写查询。

尝试这样的事情:

QueryExpression objQueryExpression1 = (QueryExpression)context.InputParameters["Query"];

objQueryExpression1.LinkEntities.Add(new LinkEntity("activitypointer", "email", "activityid", "activityid", JoinOperator.LeftOuter));

objQueryExpression1.LinkEntities[0].EntityAlias = "filteredemails";
objQueryExpression1.LinkEntities[0].LinkCriteria.AddCondition("csiro_confidential", ConditionOperator.NotEqual, true);

objQueryExpression1.LinkEntities.Add(new LinkEntity("activitypointer", "task", "activityid", "activityid", JoinOperator.LeftOuter));

objQueryExpression1.LinkEntities[1].EntityAlias = "filteredTasks";
objQueryExpression1.LinkEntities[1].LinkCriteria.AddCondition("csiro_newfield", ConditionOperator.Equal, true);