2012-06-21 148 views
1

如何向鏈接實體添加過濾條件(例如,在此情況下爲電子郵件)? 將過濾條件添加到給我重複行的鏈接條件。Dynamics CRM 2011 LinkEntities左連接問題

等效的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(); 

回答

0

我不知道,如果貼查詢是你在找什麼...

如果是,那麼你應該能夠去除過濾器2,並添加過濾1

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

但是,使用AND操作將RegardingObjectId與NULL和OpportunityID進行比較不應該是真的。

+0

我正在尋找所有不在電子郵件實體中的機會。我使用左連接在sql和queryexpression類中都得到了這個問題。問題是我無法在電子郵件實體上添加過濾器。我改變了代碼以反映filter2中的關於objectid。 – mdvr

+0

@Madhavi是爲特定的電子郵件或所有電子郵件?如果它是一個特定的電子郵件,那麼在你的左連接中指定電子郵件,並且你的SQL示例的最終語句應該是「and ** o **。RegardingObjectId爲null」 –

+0

SQL對於需求正常工作。我無法在控制檯應用程序中的查詢表達式中輸入critieria(e.regardingobject爲null)。 – mdvr

0

我有類似的問題添加條件鏈接的實體。我發現我可以使用動態2013年sdk做到這一點,但是你必須看看你是否可以使用2013年的sdk來對抗2011年的動態。請參閱Microsoft Dynamics Crm Sdk - Is this query possible?

與2013 SDK的基本區別在於,您可以向過濾條件添加條件,但爲其指定一個用於鏈接實體的實體名稱。這意味着您實際上並沒有將條件添加到鏈接實體本身。

我也在該鏈接中顯示如何使用Linq提供程序來編寫查詢,這是您可能想要嘗試的另一種替代方法。