当连接到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服务器。
答案 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使用正确的代码发布了答案。
其他(不那么聪明)替代方案是:
因为只有40条记录,我建议使用后期绑定来检索记录,以便选择最小的ColumnSet。
与此问题相关的有用链接: