Crm 2011实体收集查询和性能问题

时间:2013-04-08 08:00:27

标签: c# optimization dynamics-crm-2011 dynamics-crm

我有一个应用程序需要查询某些实体并获得符合条件的实体。这是第一件事。它需要被反复调用多次不同的条件值,这是不好的,因为往返时间严重降低了性能。

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作为键?我很乐意听到任何建议。

非常感谢您提前获取任何指导。

2 个答案:

答案 0 :(得分:2)

这取决于记录的总数以及总数与您的标准匹配的数量。如果您说100,000条记录并且只有1000条符合您的标准,那么我会说要坚持您当前的方法。但是,如果你的大部分记录都是匹配的,那么它的价值就会一次又一次地将它们全部带回来然后将它们分开。

您可以在CRM中支持的一件事是将索引添加到SQL数据库中的基础表中。如果你在表格中有很多记录,这样可以加快速度。

答案 1 :(得分:2)

你需要做的第一件事,因为你只返回一条记录,就是在它上面加1。默认情况下,CRM将返回与计数匹配的前5000条记录。

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

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

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