Указанный неверный состав

Я пытаюсь ретроспективно написать несколько тестов для унаследованного кода.

Один конкретный метод вызывает у меня проблемы в методе плагина Dynamics CRM 2011 с LinkedEntityFilterCondition в QueryExpression

Структура сущностей

Контакт -(N:1 [Lookup])-> CustomEntity1 -(N:1 [Lookup])-> CustomEntity2

Цель метода

Метод, который я пытаюсь проверить, создает QueryExpression что фильтры Contacts основанный на атрибутах CustomEntity1в том числе значение LookupField в CustomEntity2,

Рабочий код запроса

Чтобы проверить мое понимание QueryExpression, я переписал код, как показано ниже

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

  query.Criteria = new FilterExpression();
  query.Criteria.FilterOperator = LogicalOperator.And;

  FilterExpression filter = new FilterExpression(LogicalOperator.And);

  FilterExpression filter1 = new FilterExpression(LogicalOperator.Or);
  filter1.Conditions.Add(new ConditionExpression("new_datefield1", ConditionOperator.Null));
  filter1.Conditions.Add(new ConditionExpression("new_datefield1", ConditionOperator.LessEqual, offset));

  FilterExpression filter2 = new FilterExpression(LogicalOperator.Or);
  filter2.Conditions.Add(new ConditionExpression("new_datefield2", ConditionOperator.Null));
  filter2.Conditions.Add(new ConditionExpression("new_datefield2", ConditionOperator.LessEqual, offset));

  filter.AddFilter(filter1);
  filter.AddFilter(filter2);

  query.Criteria.Filters.Add(filter);

  // Create the link from the contact to the CustomEntity1 entity
  LinkEntity linkHistory = new LinkEntity(Contact.EntityLogicalName, new_CustomEntity1.EntityLogicalName, Contact.AttributeNames.new_CustomEntity1Lookup, new_CustomEntity1.AttributeNames.Id, JoinOperator.Inner);
  linkHistory.Columns = new ColumnSet(true);
  linkHistory.EntityAlias = "custEnt1";

  linkHistory.LinkCriteria = new FilterExpression();
  linkHistory.LinkCriteria.FilterOperator = LogicalOperator.And;

  #region code added to make the test work
  // Create the CustomEntity2 condition
  LinkEntity linkStatus = new LinkEntity(new_CustomEntity1.EntityLogicalName, new_CustomEntity2.EntityLogicalName, new_CustomEntity1.AttributeNames.new_CustomEntity2Lookup, new_CustomEntity2.AttributeNames.Id, JoinOperator.Inner);
  linkStatus.Columns = new ColumnSet(true);
  linkStatus.EntityAlias = "custEnt2";

  linkStatus.LinkCriteria = new FilterExpression();
  linkStatus.LinkCriteria.FilterOperator = LogicalOperator.And;
  linkStatus.LinkCriteria.Conditions.Add(new ConditionExpression(new_CustomEntity2.AttributeNames.Id, ConditionOperator.Equal, indStatus.Id));

  linkHistory.LinkEntities.Add(linkStatus);
  #endregion

  //some code removed for brevity

  query.LinkEntities.Add(linkHistory);

Этот код возвращает выражение QueryExpression, которое затем используется для запуска теста, тесты проходят при запуске с некоторыми тестовыми данными, настроенными в FakeXrmEasy. Однако мне нужно убедиться, что мои изменения не оказывают негативного влияния на текущий код и логику, поэтому я хотел проверить свои результаты по сравнению с текущим методом, прежде чем вносить какие-либо изменения.

Нерабочий код

QueryExpression query = new QueryExpression();

query.PageInfo = new PagingInfo();
query.PageInfo.Count = fetchCount;
query.PageInfo.PageNumber = pageNumber;
query.PageInfo.PagingCookie = null;

// Setup the query for the contact entity
query.EntityName = Contact.EntityLogicalName;

// Specify the columns to retrieve
query.ColumnSet = new ColumnSet(true);

query.Criteria = new FilterExpression();
query.Criteria.FilterOperator = LogicalOperator.And;

FilterExpression filter1 = new FilterExpression();
filter1.FilterOperator = LogicalOperator.Or;

// Create the e2sds_lastcontactdate condition
ConditionExpression condition1 = new ConditionExpression();
condition1.AttributeName = Contact.AttributeNames.new_DateField1;
condition1.Operator = ConditionOperator.Null;

// Create the e2sds_lastcontactdate condition
ConditionExpression condition2 = new ConditionExpression();
condition2.AttributeName = Contact.AttributeNames.new_DateField1;
condition2.Operator = ConditionOperator.LessEqual;
condition2.Values.Add(offset);

FilterExpression filter2 = new FilterExpression();
filter2.FilterOperator = LogicalOperator.Or;

// Create the Last Third Party Contact condition
ConditionExpression ltpcCond1 = new ConditionExpression();
condition1.AttributeName = Contact.AttributeNames.new_DateField2;
condition1.Operator = ConditionOperator.Null;

// Create the Last Third Party Contactcondition
ConditionExpression ltpcCond2 = new ConditionExpression();
condition2.AttributeName = Contact.AttributeNames.new_DateField2;
condition2.Operator = ConditionOperator.LessEqual;
condition2.Values.Add(offset);

filter2.Conditions.AddRange(ltpcCond1, ltpcCond2);

query.Criteria.Filters.Add(filter1);
query.Criteria.Filters.Add(filter2);

// Create the link from the contact to the CustomEntity1 entity
LinkEntity linkHistory = new LinkEntity();
linkHistory.JoinOperator = JoinOperator.Natural;
linkHistory.LinkFromEntityName = Contact.EntityLogicalName;
linkHistory.LinkFromAttributeName = Contact.AttributeNames.new_CustomEntity1Lookup;
linkHistory.LinkToEntityName = new_CustomEntity1.EntityLogicalName;
linkHistory.LinkToAttributeName = new_CustomEntity1.AttributeNames.Id;

linkHistory.LinkCriteria = new FilterExpression();
linkHistory.LinkCriteria.FilterOperator = LogicalOperator.And;

#region this code throws a specified cast not valid exception
// Create the e2sds_statusid condition
ConditionExpression condition3 = new ConditionExpression();
condition3.AttributeName = new_CustomEntity1.AttributeNames.new_CustomEntity2LookupField;
condition3.Operator = ConditionOperator.Equal;
condition3.Values.Add(status.Id);
#endregion

linkHistory.LinkCriteria.Conditions.Add(condition3);

//removed code for brevity

query.LinkEntities.Add(linkHistory);

Что я пробовал К сожалению как QueryExpression выполняется в RetrieveMultiple запрос Я не могу войти в код, чтобы выяснить, какие данные вызывают неправильное приведение, однако комментирование области, отмеченной в нерабочем коде, означает, что исключение исчезнет.

Переписать код можно, так как я знаю, что TestData работает, поскольку рабочий код QueryExpression, который я написал, возвращает набор данных.

Я не знаю, связана ли проблема с QueryExpression или FakeXrmEasy на данный момент, поэтому даже предоставление методов для отслеживания основной причины проблемы было бы полезно, если фактическое разрешение не может быть предоставлено.

Примечание. Имена пользовательских объектов, полей и поисков были изменены из соображений конфиденциальности. Если имена не совпадают, скорее всего, ошибка переноса вручную, чем проблемы с кодом.

1 ответ

Решение

Это связано с тем, как crmsvcutil генерирует прокси-типы. Там могут быть различия между разными версиями.

Только что обновил вопрос на GitHub

Другие вопросы по тегам