0

Я пытаюсь ретроспективно написать некоторые модульные тесты для кода, который я унаследовал.Заказано Cast Invalid

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

Структура субъектов

Контакт - (N: 1 [Поиск]) -> CustomEntity1 - (N: 1 [Поиск]) -> 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 создает прокси-типы. Там могут быть различия между различными версиями.

Только что обновил номер on GitHub

Смежные вопросы