1

いくつかのエンティティをクエリし、条件に一致するエンティティを取得する必要があるアプリケーションがあります。これが最初に行われたことでした。異なる基準値で何度も何度も呼び出す必要がありますが、これは悪いことです。往復時間がパフォーマンスを著しく低下させているからです。

private AnEntity GetEntity(string criteriaValue, IOrganizationService service)
{
    QueryExpression query = new QueryExpression();
    query.EntityName = "entityname";
    query.ColumnSet = new ColumnSet(new string[] { "desiredField1", "desiredField2" });
    query.Criteria = new FilterExpression();
    query.Criteria.FilterOperator = LogicalOperator.And;
    query.Criteria.Conditions.Add(new ConditionExpression("criteriaField", ConditionOperator.Equal, criteriaValue));
    EntityCollection entities = service.RetrieveMultiple(query);
    if (entities.Entities.Count > 0)
    {
        return (AnEntity)entities[0];
    }
    return null;
}

現在、アプリケーションの起動時にすべてのエンティティを一度取得し、EntityCollection で LINQ クエリを使用することを検討しています。

private AnEntity GetEntity(string criteriaValue, EntityCollection theEntityCollection)
{
    var desiredEntity = from e in theEntityCollection.Entities
    where e.criteriaField.Equals(criteriaValue)
    select e;
    return (AnEntity)desiredEntity;
}

このアプローチに代わるより良い方法はありますか? すべてを取得し、それらを HashTable/Dictionary に格納し、criteriaValue をキーとして使用しますか? 提案があればぜひ聞きたいです。

どうぞよろしくお願いいたします。

4

2 に答える 2

2

返されるレコードは 1 つだけなので、最初に行う必要があるのは、そのレコードにカウント 1 を設定することです。デフォルトでは、CRM はカウントに一致する最初の 5000 件のレコードを返します。

最初のアイテムのみを返すように指定するコードは次のとおりです。

query.PageInfo.Count = 1; // Number of records to return
query.PageInfo.PageNumber = 1; // Page count.

それでも許容レベルまでパフォーマンスが向上しない場合は、すべてのエンティティを取得して Dictionary として格納することも有効な方法です。データが古くなる可能性があることを覚えておいてください...

于 2013-04-08T12:24:32.830 に答える