4

连接到 CRM 2013 时,是否有一种智能方法可以创建一个 lambda 表达式,该表达式获取 GUID 位于列表中的实体。

此代码在 Where 子句上中断并给出错误:

'where' 条件无效。实体成员正在调用无效的属性或方法。

代码:

    private List<UserInformationProxy> GetContactsFromGuidList(List<Guid> contactList)
    {
        var result = _serviceContext.ContactSet
            .Where(x=> contactList.Contains((Guid) x.ContactId)) // this line breaks
            .Select(x => new UserInformationProxy()
            {
                FullName = x.FullName,
                Id = x.ContactId
            })
            .Distinct()
            .ToList<UserInformationProxy>();

        return result;
    }

    // return class
    public class UserInformationProxy
    {
        public Guid? Id { get; set; }
        public string FullName { get; set; }
        public string DomainName { get; set; }
    }

目前我正在通过从 ContactSet 中获取所有联系人并在我的代码中使用循环整理出我想要的联系人来解决这个问题。这可行,但速度很慢,因为我需要获取所有 10000 个联系人,而不是将 40 个我真正感兴趣的 Guid 发送到 SQL 服务器。

4

2 回答 2

5

QueryExpressions 支持 In 运算符,因此应该可以正常工作:

private List<UserInformationProxy> GetContactsFromGuidList(List<Guid> contactList)
{
    var qe = new QueryExpression(Contact.EntityLogicalName);
    qe.ColumnSet = new ColumnSet("fullname", "contactid")
    qe.Criteria.AddCondition("contactid", ConditionOperator.In, list.Cast<Object>().ToArray());
    qe.Distinct = true;

    var results = service.RetrieveMultiple(qe).Entities.Select (e => e.ToEntity<Contact>()).
        Select(x => new UserInformationProxy()
        {
            FullName = x.FullName,
            Id = x.ContactId
        });

    return results;
}

附带说明一下,每个联系人都必须有一个不为空的 ID,因此无需检查它。

于 2014-01-13T14:01:13.857 回答
2

编辑:可以使用单个查询来完成,达里尔用正确的代码发布了一个答案。

其他(不那么聪明)的选择是:

  1. 检索所有记录并检查指南后
  2. 为每个 Guid 进行一次检索

因为只有 40 条记录,我建议使用后期绑定来检索记录,以便选择最小的 ColumnSet。

与此问题相关的有用链接:

于 2014-01-13T11:20:38.427 回答