1

如何向链接实体添加过滤条件(例如本例中的电子邮件)?向链接条件添加了过滤条件,这给了我重复的行。

等效的 sql 查询应如下所示。

select distinct OpportunityId
from Opportunity o 
   left join Email e on e.RegardingObjectId = o.OpportunityId 
   where o.StateCode = 1 and o.StatusCode = 3 
     and e.RegardingObjectId is null

但是QueryExpression班级正在按照以下方式进行。

select distinct opportunityid 
from Opportunity o 
  left join Email e 
    on e.RegardingObjectId = o.OpportunityId 
    and e.RegardingObjectId is null
    where o.StateCode = 1 and o.StatusCode = 3 

编码:

ClientCredentials Credentials = new ClientCredentials();
Credentials.Windows.ClientCredential 
  = System.Net.CredentialCache.DefaultNetworkCredentials;

Uri OrganizationUri = ""
Uri HomeRealmUri = null;
OrganizationServiceProxy orgService 
  = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, Credentials, null);
IOrganizationService _service = (IOrganizationService)orgService;

QueryExpression query = new QueryExpression();
query.Distinct = true;
query.EntityName = "opportunity";
query.ColumnSet = new ColumnSet(true);

FilterExpression filter1 = new FilterExpression();
filter1.FilterOperator = LogicalOperator.And;
filter1.AddCondition("statuscode", ConditionOperator.Equal,3);
filter1.AddCondition("statecode", ConditionOperator.Equal, 1);
query.Criteria = filter1;

LinkEntity linkEntity1 = new LinkEntity();
linkEntity1.JoinOperator = JoinOperator.LeftOuter;
linkEntity1.LinkFromEntityName = "opportunity";
LinkEntity1.LinkFromAttributeName = "opportunityid";
linkEntity1.LinkToEntityName = "email";
linkEntity1.LinkToAttributeName = "regardingobjectid";

query.LinkEntities.Add(linkEntity1);

FilterExpression filter2 = new FilterExpression();

在这种情况下,问题就在这里。我可以在查询上使用过滤器,LinkCriteria但不能在查询上使用,因为它是链接实体。

filter2.AddCondition("regardingobjectid", ConditionOperator.Null);
query.LinkEntities[0].LinkCriteria = filter2;

EntityCollection result = _service.RetrieveMultiple(query);

Console.WriteLine(result.Entities.Count());
Console.ReadKey();
4

2 回答 2

0

我不确定发布的查询是否是您要查找的内容...

如果是,那么您应该能够删除过滤器 2 并添加到过滤器 1

filter1.AddCondition("opportunityid", ConditionOperator.Null);

但是,将有关ObjectId 与 NULL 和 OpportunityID 与 AND 操作进行比较不应该是正确的。

于 2012-06-21T21:03:55.837 回答
0

我在为链接实体添加条件时遇到了类似的问题。我发现我可以使用 dynamics 2013 sdk 来做到这一点,但是你必须看看你是否可以使用 2013 sdk 来对抗 2011 的动态。请参阅Microsoft Dynamics Crm Sdk - 此查询是否可行?

与 2013 SDK 的基本区别是您可以向过滤器添加一个条件,但给它一个用于链接实体的实体名称。这意味着您实际上并未将条件添加到链接实体本身。

我还在该链接中展示了如何使用 Linq 提供程序编写查询,这是您可能想要尝试的另一种选择。

于 2014-03-25T19:20:42.800 回答