2016-10-10 4 views
2

CRMのレコードが存在するかどうかをチェックするコードを作成しました。問題は、IOrganisationService.Retrieveが、レコードが見つからない場合にnullの代わりにエラーを返すことです。私は複数のレコードが見つからないことを期待していますし、tryキャッチを使用してキャッチからエラーを使用する必要はありません。IOrganisationService.Retrieveレコードが存在しません

using (OrganizationServiceProxy serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, credentials, null)) 
      { 
       IOrganizationService service = (IOrganizationService)serviceProxy; 
       //Get record 

       var record = service.Retrieve(entryId, guid, new ColumnSet(true)); //switch to var if no work 
       //Check if record is not null/empty 
       recordExists = !String.IsNullOrWhiteSpace(record.Id.ToString()); //<- does the record exist 
      } 

提案ですか?

+0

try/catchを使用しないのはなぜですか?私の答えを参考にしてください。 – Phil

答えて

1

使用RetrieveMultipleあなたが興味を持っているIDを持つユーザーを検索する:

// Create and cache the plugin context 
this.context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
this.service = serviceFactory.CreateOrganizationService(this.context.UserId); 

// Retrieve users with certain ID 
Guid userId = Guid.NewGuid(); 
var query = new QueryExpression("systemuser"); 
query.Criteria.AddCondition(new ConditionExpression("systemuserid", ConditionOperator.Equal, userId)); 

EntityCollection users; 
try 
{ 
    users = this.service.RetrieveMultiple(query); 
} 
catch (FaultException<OrganizationServiceFault> faultException) 
{ 
    throw new InvalidPluginExecutionException($"Failed to retrieve system users that have an ID of '{userId}'", faultException); 
} 

if (users.Entities.Length == 0) // (or !users.Entities.Any() using Linq) 
{ 
    // Do something 
} 
+0

コードがうまくいきません。私の説明は少し悪いかもしれません。結果が見つからない場合のRetrieveメソッドのエラー。レコードが存在しないと言ってキャッチを使わずに、どのCRMレコードが存在しないかを知りたい。 – Zain

+0

私は 'Retrieve'メソッドを使ってそれが可能だとは思いません。レコードが存在しない場合、CRMサービスは 'FaultException '型の例外をスローします。しかし、あなたが興味のあるIDを持つレコードのリストを取得するためには 'RetrieveMultiple'を使用します。長さが0の場合、例外はスローされません。私は私の答えを更新しました。 – Phil

+0

'Retrieve'メソッドは、指定されたレコードを返すことになっており、その呼び出しはまれにしか失敗しません。したがって、エラー処理は、可能な限り最高レベルで処理されることが好ましい。 –

2

方法Retrieveは、指定されたIDを持つレコードが実際にシステムに存在することを前提としています。一般的に、2つのシナリオでのみ失敗します。

  1. レコードが別のユーザーまたはプロセスによって削除されました。
  2. ユーザーに十分な読み取り権限がありません。

存在しない可能性のあるデータを照会する必要がある場合、または照会でゼロまたは1つ以上のレコードが得られる場合は、QueryExpression照会を使用してください。 RetrieveMultipleメソッドを使用してこれらのクエリを発行できます。必要に応じて、基本的にQueryExpression機能をラップするCRM用LINQを使用することもできます。

関連する問題