使用包含.Where子句的Lambda表达式

时间:2014-01-13 09:47:24

标签: c# lambda dynamics-crm-2011 dynamics-crm-2013

当连接到CRM 2013时,有一种智能方法可以创建一个lambda表达式,以获取GUID在List中的实体。

此代码在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 Im的Guids发送到SQL服务器。

2 个答案:

答案 0 :(得分:4)

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,因此无需检查它。

答案 1 :(得分:2)

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

其他(不那么聪明)替代方案是:

  1. 检查所有记录并检查Guids
  2. 为每个Guid执行一次检索
  3. 因为只有40条记录,我建议使用后期绑定来检索记录,以便选择最小的ColumnSet。

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