带有 .Where 子句并使用 Contains 的 Lambda 表达式

Jen*_*nsB 4 c# lambda dynamics-crm-2011 dynamics-crm-2013

连接到 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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ryl 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;
}
Run Code Online (Sandbox Code Playgroud)

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