您不能将 Contains 方法与 LINQ for Dynamics CRM 一起使用。
一般是正确的,您可以将整个实体集放入内存,然后执行您的 contains 方法。然而,这是低效的——尤其是当系统上线后实体集增加时。
我假设您正在使用早期绑定上下文,这就是您要使用 LINQ 的原因,如果这是正确的,那么可以选择执行以下操作:
var usersList= new [] {
"User1",
"User2"
};
var systemUserQuery = new QueryExpression{
EntityName = SystemUser.EntityLogicalName,
ColumnSet = new ColumnSet("fullname","domainname" ....), //explicitly retrieve attributes
Criteria = {
Conditions = {
new ConditionExpression("fullname", ConditionOperator.In, userList)
}
}
};
var usersResponse = organizationService.RetrieveMultiple(systemUserQuery);
var systemUsers = usersResponse.Entities.Select(s => (SystemUser)s).ToArray();
这不会在表达式中使用 LINQ 来检索数据,但是查询是远程执行的,您不需要检索整个实体集。在语句var systemUsers = usersResponse.Entities.Select(s => (SystemUser)s).ToArray(); 中,对象类型Microsoft.Xrm.Sdk.Entity 将被转换为Early Bound 类型SystemUser,并且您可以像任何其他Early Bound 对象一样继续使用这些对象。
使用ConditionOperator.In 运算符时,提供的值需要是一个数组。您可以将userList 变量声明为List<string>,如您的示例中所示。但是,您需要在将对象添加到查询之前对其进行转换。
请注意ColumnSet = new ColumnSet("fullname","domainname" ....) 行是您选择要在请求中检索的属性的位置。如果您没有在此处指定属性,则该属性将是强制转换后的默认值。