0

私が継承したコードの単体テストを遡及的に記述しようとしています。指定されたキャストが無効

一つの特定の方法は、エンティティのQueryExpression

構造でLinkedEntityFilterConditionと私ダイナミクスCRM 2011プラグイン方式内の問題を引き起こしている

接触 - (N:1 [参照]) - > CustomEntity1 - (N:1 [参照]) - > CustomEntity2

方法の目的

私がテストしようとしている方法は、LookupFieldからCustomEntity2の値を含めて、CustomEntity1の属性に基づいてContactsをフィルタリングする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を返し、以下のようにコードを書き換えているの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要求で実行され しかし、無効なキャストは、非動作コードにマークされている領域をコメントアウトすると、例外がなくなることを意味します。

コードを書き直すことはオプションです - 私が書いた動作中のQueryExpressionコードとしてTestDataがどのように機能するかは、データセットを返します。

現時点で問題がQueryExpressionかFakeXrmEasyかどうかわかりませんので、実際の解決策が提供できない場合は、問題の根本原因を追跡する方法を提供することも役立ちます。

注:カスタムエンティティ、フィールド、およびルックアップの名前は機密性の理由で変更されています。名前がコードの問題よりも手動転置エラーの可能性が高い場合

答えて

1

これは、crmsvcutilがプロキシタイプを生成する方法に関連しています。異なるバージョン間で違いがあるかもしれません。

この問題を更新しましたon GitHub

関連する問題