Вы не можете использовать метод Contains с LINQ для Dynamics CRM.
Общее правильно, вы можете перенести весь набор сущностей в память, а затем выполнить свой метод содержит. Тем не менее, это неэффективно, особенно когда сущность устанавливает увеличение после того, как система заработала.
Я сделал предположение, что вы используете контекст с ранней привязкой, поэтому вы хотите использовать 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
будет приведен как тип раннего связывания SystemUser
, и вы сможете продолжать использовать эти объекты, как и любой другой объект раннего связывания.
При использовании оператора ConditionOperator.In
указанное значение должно быть массивом. Вы можете объявить переменную userList
как List<string>
, как в вашем примере. Тем не менее, вам нужно будет привести его перед добавлением объекта в запрос.
Просто обратите внимание на строку ColumnSet = new ColumnSet("fullname","domainname" ....)
, где вы выбираете атрибуты для извлечения в запросе. Если вы не укажете здесь атрибут, это свойство будет значением по умолчанию после приведения.