У меня есть некоторый код следующим образом:«Значение, переданное для ConditionOperator.In пусто» с ConditionExpression использования ConditionOperator.In против пустого массива операнда
QueryExpression qxEmpty = new QueryExpression("systemuser");
object[] guids = (new Guid[] { }).Cast<object>().ToArray();
ConditionExpression c = new ConditionExpression("systemuserid", ConditionOperator.In, guids);
qxEmpty.Criteria.AddCondition(c);
EntityCollection ecEmpty = service.RetrieveMultiple(qxEmpty);
Это не будет работать на последнюю строку с FaultException:
The value passed for ConditionOperator.In is empty
Если я инициализирую переменную guids
, чтобы содержать один или несколько действительных указаний, существующих в целевом CRM, я получаю ожидаемый результат.
Почему почему RetrieveMultiple генерирует исключение, когда у меня есть условие, которое задает вопрос, является ли значение членом пустого набора? Условие должно оцениваться как false, а RetrieveMultiple должно возвращать пустой EntityCollection, а не исключать исключение, не так ли?
MSDN похоже, что это проблема с перегрузкой метода конструктора ConditionExpression, и чтобы убедиться, что используется соответствующий тип объекта, но насколько я могу судить, я делаю это правильно, передавая массив объектов : https://msdn.microsoft.com/en-us/library/gg334419(v=crm.7).aspx
Я использую версию 7.1.0.1085 в Microsoft.Xrm.Sdk
Edit: Я думаю, я не прошу правильный вопрос. Как передать пустой набор в ConditionExpression для использования с ConditionOperator.In?
Редактировать 2: Хорошо, вот SQL, который я пытаюсь перевести на QueryExpression.
SELECT *
FROM SystemUser
WHERE SystemUserId IN
(
SELECT SystemUserid
FROM SystemUser
WHERE X=Y
)
Я перевел это примерно следующим образом:
QueryExpression qxEmpty = new QueryExpression("systemuser");
object[] guids = getGuids(); // calls a method that executes the subquery
ConditionExpression c = new ConditionExpression("systemuserid", ConditionOperator.In, guids);
qxEmpty.Criteria.AddCondition(c);
EntityCollection ecEmpty = service.RetrieveMultiple(qxEmpty);
Проблема с вышесказанным он терпит неудачу, когда подзапрос не имеет значения. В SQL это не терпит неудачу, это дает мне пустой набор, который я хочу получить в результате запроса QueryExpression.
Редактировать 3:
Ой, я вдруг понял, почему это глупый вопрос. Поскольку CRM не поддерживает подзапросы, и в любом случае я должен делать это в двух отдельных запросах, я мог бы также не выполнять второй запрос, когда список пуст, потому что я уже знаю результат и поэтому не должен тратить ресурсы. Поэтому, хотя может показаться более элегантным поддерживать передачу пустого массива, на самом деле исключение является хорошим сигналом для меня, чтобы добавить явные проверки кода.
ли вы пытаетесь сделать GUIDs Guid [], не является объектом []? Существует перегрузка объекта [], которую, как я думаю, использует компилятор. См. Https://community.dynamics.com/crm/b/crmdavidjennaway/archive/2011/05/25/unexpected-error-with-conditionoperator-in-and-typed-arrays – Mangist
@Mangist Да, я пробовал что. Если я заменил вторую строку моего выше кода на Guid [] guids = new Guid [] {}; Я получаю то же исключение. – pabrams