У меня есть приведенный ниже код, который возвращает всех пользователей на основе фильтра. Проблема в том, что он возвращает только 100 пользователей, но я знаю, что их намного больше.
private List<User> GetUsersFromGraph()
{
if (_graphAPIConnectionDetails == null) ReadParametersFromXML();
if (graphServiceClient == null) graphServiceClient = CreateGraphServiceClient();
var users = graphServiceClient
.Users
.Request()
.Filter(_graphAPIConnectionDetails.UserFilter)
.Select(_graphAPIConnectionDetails.UserAttributes)
.GetAsync()
.Result
.ToList<User>();
return users;
}
метод возвращает только 100 пользовательских объектов. Мои отчеты администратора портала Azure должны быть ближе к 60 000.
Большинство конечных точек в Microsoft Graph возвращают данные на страницах, включая /users
.
Чтобы получить остальные результаты, вам нужно просмотреть страницы:
private async Task<List<User>> GetUsersFromGraph()
{
if (_graphAPIConnectionDetails == null) ReadParametersFromXML();
if (graphServiceClient == null) graphServiceClient = CreateGraphServiceClient();
// Create a bucket to hold the users
List<User> users = new List<User>();
// Get the first page
IGraphServiceUsersCollectionPage usersPage = await graphClient
.Users
.Request()
.Filter("filter string")
.Select("property string")
.GetAsync();
// Add the first page of results to the user list
users.AddRange(usersPage.CurrentPage);
// Fetch each page and add those results to the list
while (usersPage.NextPageRequest != null)
{
usersPage = await usersPage.NextPageRequest.GetAsync();
users.AddRange(usersPage.CurrentPage);
}
return users;
}
Одно очень важное замечание: этот метод является наименее эффективным способом извлечения данных из Graph (или любого REST API). Ваше приложение будет сидеть там долгое время, пока загружает все эти данные. Правильная методология здесь — извлекать каждую страницу и обрабатывать только эта страница перед извлечением дополнительных данных.
@Marc LaFleur, я использую этот подход, но, как вы сказали, это занимает огромное количество времени ... но мне нужно каким-то образом иметь пользователей в списке, потому что, когда я иду, чтобы создать соавтора, у меня есть это раскрывающееся меню с azure AD пользователи, я выбираю их, чтобы создать пользователя с этой информацией... Как я могу добиться этого с максимальной производительностью?
Если у вас достаточно пользователей, и это занимает много времени, они, вероятно, не должны быть в раскрывающемся списке. Вам лучше использовать поле поиска, которое фильтрует список пользователей.
Я согласен. Это часть пакетной работы один раз в день, поэтому я думаю, что со мной все будет в порядке. Но я принимаю вашу точку зрения, если хочу использовать этот код в пользовательском приложении. Тогда это будет проблемой.