1

Я использую CRM SDK от PowerShell, пытаясь запросить контракт, связанный с конкретным именем учетной записи. Если я делаю запрос против GUID учетной записи, я получаю результаты, но я хочу запросить имя внутри объекта EntityReference, а не GUID, например (это работает отлично):DynamicsCRM QueryExpression Criteria внутри EntityReference

$query = new-object Microsoft.Xrm.Sdk.Query.QueryExpression('new_contract') 
$query.Criteria.AddCondition('new_account', [Microsoft.Xrm.Sdk.Query.ConditionOperator]::Equal, $AccountGuid) 

Вышеприведенные результаты выглядит следующим образом:

Key     Value 
---     ----- 
createdby   Microsoft.Xrm.Sdk.EntityReference 
createdon   21/10/2014 
modifiedby   Microsoft.Xrm.Sdk.EntityReference 
modifiedon   28/02/2016 
modifiedonbehalfby Microsoft.Xrm.Sdk.EntityReference 
new_account   Microsoft.Xrm.Sdk.EntityReference 
[...]    [...] 

в new_account Свойства:

Id   : dab2909d-6149-e411-93fc-005056af5481 
LogicalName : account 
Name   : CustomerNameText 
KeyAttributes : {} 
RowVersion : 
ExtensionData : System.Runtime.Serialization.ExtensionDataObject 

Я хочу, чтобы создать запрос для new_contract с new_account Name LIKE CustomerNameText

Я пробовал:

$query.Criteria.AddCondition('new_account',([Microsoft.Xrm.Sdk.EntityReference].Attributes['new_account']).Name, [Microsoft.Xrm.Sdk.Query.ConditionOperator]::Like, $AccountName) 

Но это не работает получить следующее сообщение об ошибке:

Exception calling "RetrieveMultiple" with "1" argument(s): "Link entity with name or alias new_account is not found" 
At line:2 char:5 
+  $temp = $service.RetrieveMultiple($query); 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FaultException`1 

Я надеюсь, я понятен, но если нет, прокомментируйте любой вопрос.

Powershell код предпочтительнее, C# это нормально, а также

Благодаря ...

ответ

3

Вы не можете использовать QueryExpression критерии для EntityReference имени. С EntityReference вы можете использовать только Guid.

Если вы хотите выполнить запрос по имени, вы можете использовать LinkEntity в QueryExpression. Вы должны будете использовать LinkCriteria

var q = new QueryExpression(); 
      q.EntityName = "new_contract"; 
      q.ColumnSet = new ColumnSet(); 
      q.ColumnSet.Columns.Add("new_contractid"); 

      q.LinkEntities.Add(new LinkEntity("new_contract", "account", "new_account", "accountid", JoinOperator.Inner)); 
      q.LinkEntities[0].Columns.AddColumns("accountid", "name"); 
      q.LinkEntities[0].EntityAlias = "temp"; 
      q.LinkEntities[0].LinkCriteria.AddCondition("name", ConditionOperator.Equal, "yourAccountName"); 

P.S Если выше фрагмент кода, не работает для вас. И вы хотите получить accountName. Для этого используйте существующий код, используя Guid учетной записи. Но сначала вы должны получить accountGuid by name. В этом случае

public Guid getAccountGuidByName(string name) 
    { 

     QueryExpression accountQuery = new QueryExpression("account"); 
     accountQuery.Criteria.AddCondition("name", ConditionOperator.Equal, "yourAccountName"); 
     EntityCollection entCol = Service.RetrieveMultiple(accountQuery); 
     if (entCol.Entities.Count > 0) 
     { 
      return entCol.Entities[0].Id; 
     } 
     return Guid.Empty; 

    } 

только для примера я не знаю, как вы можете вызвать функцию и т.д. в PowerShell, но я обеспечиваю C# код, как вы сказали, его хорошо, если это в C# затем использовать его, как показано ниже:

$query = new-object Microsoft.Xrm.Sdk.Query.QueryExpression('new_contract') 
$query.Criteria.AddCondition('new_account', [Microsoft.Xrm.Sdk.Query.ConditionOperator]::Equal, getAccountGuidByName("yourAccountName")); 
+0

Спасибо, пожалуйста, обновите свой ответ в соответствии с моими критериями, например new_contract -> new_account по имени, поэтому мне будет легче понять ваш ответ и перевести его обратно в powershell – Avshalom

+0

@Avshalom да, я могу, но вы должны предоставить мне данные полей, которые используются для отношений. также я думаю, что «new_contract» и «new_account» являются вашими настраиваемыми полями. Добавить информацию о взаимоотношениях на ваш вопрос –

+0

'new_contract' является сущностью контрактов,' new_account' является настраиваемым именем для объекта 'account', у него есть отношения (но я не уверен в имени)' name 'поле, которое я ищу, является именем объекта' account', я хочу найти контракты, имена которых являются «somename» – Avshalom