我有一个应用程序需要查询一些实体并获得符合条件的实体 . 这是第一件事 . 它需要被反复调用多次不同的条件值,这是不好的,因为往返时间严重降低了性能 .
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 回答
您需要做的第一件事是,因为您只返回一条记录,所以要对其进行计数 . 默认情况下,CRM将返回与计数匹配的前5000条记录 .
以下是指定您只想返回第一个项目的代码:
如果这不能将性能提高到可接受的水平,则检索所有实体并将它们存储为Dictionary也是一种有效的方法 . 请记住,数据可能会变得陈旧......
这取决于记录的总数与总数中符合您的标准的数量 . 如果您说100,000条记录并且只有1000条符合您的标准,那么我会说要坚持您当前的方法 . 但是,如果你的大多数记录都是匹配的,那么它的 Value 就会让它们全部回归,然后将它们分开 .
CRM中支持的一件事是将索引添加到SQL数据库中的基础表中 . 如果表中有很多记录,那么这样可以加快速度 .