2016-01-15 1 views
0

Мне нужно извлечь одно значение из объекта. Это своего рода глобальная настройка, и она не имеет отношений с вызывающим объектом. Но когда я пытаюсь сделать это с RetrieveMultiple, я получаю пустой ответ.Извлечение единственного объекта

string name="objectToRetrieve"; 
QueryExpression qe = new QueryExpression { EntityName = "new_setting", ColumnSet =new ColumnSet ("new_name","new_value")}; 
qe.Criteria.AddCondition("new_name", ConditionOperator.Equal, name); 
EntityCollection response = service.RetrieveMultiple(qe); 

Когда я его получаю Guid все работает нормально.

Entity response = service.Retreve("new_setting", Guid.Parse("09BF9644-9BBA-E511-80FA-005056924035), new ColumnSet("new_value")); 

Как получить его без Guid?

+0

По какой-то причине 'new_setting.new_name! = Name' - это так просто. Возможно ли, что у вас есть какое-то ведущее/конечное пространство или скрытый символ в значении поля CRM? Работает ли он, если вы делаете расширенный поиск? Если это так, загрузите FetchXml и посмотрите, будет ли это работать в вашем коде в качестве теста. – Nicknow

+0

может быть вызвано тем, как добавляется добавление, лично я сначала создаю FilterExpression, добавляю условие к filterexpression и после присваивания filterexpression к свойству Criteria. если OP хочет проверить ... –

ответ

1

Ваш выбор нескольких из них настроен правильно. Таким образом, есть пара вариантов, которые можно было бы случающиеся ...

  • если вы не получаете никаких записей назад от получения множественным, то ваши записи вы извлечения по GUID не имеет NEW_NAME значение, что вы думаете оно делает.
  • Если вы получаете запись назад, и она не содержит значения для new_value, тогда у вас может быть несколько записей с тем же значением new_name, и вы получаете другую запись. Проверьте идентификатор GUID, чтобы убедиться, что он соответствует ожидаемому.
  • Возможно, у вас есть плагин, который запускает множественное извлечение, которое изменяет возвращаемые результаты.
  • Потенциально вы также можете попасть в другую организацию или, возможно, использовать другого пользователя, который не имеет прав на чтение этого объекта, потому что, если их организация. Это работает в плагине или внешнем процессе?

Ваш код верный, вам нужно подумать о том, какое предположение вы сделали, а это не так. Сначала я должен убедиться, что GUID возвращаемого объекта соответствует ожидаемому.

+0

Спасибо, это был действительно плагин, который формировал new_name, добавляя дополнительную информацию в строку. – user3032348

-1

Когда вам нужно запросить одну запись по ее имени, ваш образец кода должен сделать трюк. Конечно, в запрошенной системе на самом деле должно присутствовать запись с именем «objectToRetrieve». Сначала я искал бы ошибку.

Рассмотрите возможность добавления фильтра в состояние записи. В динамике записи CRM могут быть активными или неактивными. Как правило, неактивные записи исключаются из бизнес-процессов.

Кроме того, когда ваш запрос не должен возвращать более 1 строки, вы можете установить для свойства TopCount значение 1. Это позволяет SQL Server обрабатывать ваш запрос несколько более эффективно.

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

var query = new QueryExpression("new_setting") { TopCount = 1 }; 
query.ColumnSet.AddColumn("new_setting"); 
query.Criteria.AddCondition("new_name", ConditionOperator.Equal, name); 
query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0); 

EntityCollection response = service.RetrieveMultiple(query); 

// Assuming new_value is a string attribute: 
Console.WriteLine(response.Entities[0].GetAttributeValue<string>("new_value")); 

Вашей второй фрагмент кода содержит опечатки, но идея в порядке. Когда вы знаете, что идентификатор записи на forehand, извлекая его по id, является самой эффективной задачей.

Entity settingEntity = service.Retrieve("new_setting", new Guid("09BF9644-9BBA-E511-80FA-005056924035"), new ColumnSet("new_value"));