首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定强制转换无效

指定强制转换无效
EN

Stack Overflow用户
提问于 2017-02-01 11:24:12
回答 1查看 213关注 0票数 0

我正试图为我继承的代码编写一些单元测试。

一种特殊的方法是在Dynamics 2011插件方法中使用LinkedEntity FilterConditionQueryExpression中给我带来问题。

实体的结构

联系人-(N:1查找)-> CustomEntity1 -(N:1查找)-> CustomEntity2

方法的目标

我正在尝试测试的方法创建了一个QueryExpression,它根据CustomEntity1的属性(包括LookupFieldCustomEntity2的值)过滤Contacts

工作查询代码

为了测试我对QueryExpression的理解,我重写了如下代码

代码语言:javascript
复制
  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中设置了一些测试数据时,测试就会通过。但是,我需要确保我的更改不会对当前的代码和逻辑产生负面影响,因此在进行任何更改之前,要检查我的结果与当前的方法。

非工作代码

代码语言:javascript
复制
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);

我尝试过的不幸的是,当QueryExpressionRetrieveMultiple请求中被执行时,我无法进入代码来找出导致无效强制转换的数据,然而,注释掉在非工作代码中标记的区域意味着异常消失。

重写代码是一种选择--这就是我如何知道TestData工作的方式,因为我编写的工作QueryExpression代码返回一组数据。

我不知道目前的问题是QueryExpression还是FakeXrmEasy,所以如果不能提供实际的解决方案,即使提供跟踪问题根源的方法也是有帮助的。

注意:出于保密原因,自定义实体、字段和查找的名称已经更改。如果名称不匹配,则可能会出现手动转换错误,而不是代码问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 09:07:49

这与crmsvcutil生成代理类型的方式有关。不同版本之间可能存在差异。

刚刚更新了问题论GitHub

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41978580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档