LINQ для CRM, как использовать список C # в предложении where - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно использовать список C # в предложении LINQ , где. Я могу выполнить запрос с одним значением в предложении where, пожалуйста, укажите, как использовать список C # в запросе LINQ .

Ниже мой код:

var usersList= new List<string>();

usersList.Add("User1");
usersList.Add("User2");

(from u in UserSet
where u.FullName.Equals("any user from usersList")
select u.FullName).Take(3).Dump();

В основном, как сказать LINQ проверять каждое значение в usersList

Edit: Я делаю это LINQ для CRM

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы не можете использовать метод 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" ....), где вы выбираете атрибуты для извлечения в запросе. Если вы не укажете здесь атрибут, это свойство будет значением по умолчанию после приведения.

0 голосов
/ 28 июня 2018

Вы можете использовать Contains

var usersList= new List<string>();
usersList.Add("User1");
usersList.Add("User2");

...

(from u in UserSet
where usersList.Contains(u.FullName)
select u.FullName).Take(3)

Метод Enumerable.Contains (IEnumerable, TSource)

Определяет, содержит ли последовательность указанный элемент, используя средство сравнения по умолчанию.

Обновление

Я не вижу способа использовать Contains со списком в памяти. Однако, если список пользователей не слишком велик, вы можете сделать это по факту в памяти

var results  = (from u in UserSet
               select u.FullName);

var results (from r in results
             where usersList.Contains(r)
             select r).Take(3);

Хотя должен быть лучший путь.

...