1

我有一个应用程序需要查询一些实体并获取符合条件的实体。这是做的第一件事。它需要用不同的criteriaValues 多次调用,这很糟糕,因为往返时间严重降低了性能。

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

这取决于记录的总数与总体符合您标准的记录数。如果您说 100,000 条记录并且只有 1000 条符合您的标准,那么我会说坚持您当前的方法。但是,如果您的大多数记录都将匹配,那么值得一口气将它们全部恢复,然后将它们分开。

您可以做的一件事是在 CRM 中支持并为 SQL 数据库中的基础表添加索引。如果表中有很多记录非常值得一试,这将加快速度。

于 2013-04-08T09:19:28.610 回答
2

由于您只返回一条记录,因此您需要做的第一件事是在其上计数 1。默认情况下,CRM 将返回与计数匹配的前 5000 条记录。

这是指定您只想返回第一项的代码:

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

如果这不能将性能提高到可接受的水平,则检索所有实体并将它们存储为字典也是一种有效的方法。请记住,数据可能会变得陈旧......

于 2013-04-08T12:24:32.830 回答