Получить все контакты с помощью Lync ContactManager - PullRequest
6 голосов
/ 28 марта 2011

Сейчас я использую метод LyncClient.ContactManager.BeginSearch для поиска контактов.Тем не менее, я не смог понять, как получить все контакты.Я пытался передать "*" и "%" как символы подстановки, но это не сработало.Прямо сейчас вот мой вызов функции.

_lyncClient.ContactManager.BeginSearch("*", SearchProviders.GlobalAddressList, SearchFields.DisplayName, SearchOptions.ContactsOnly, 400, SearchCallback, "Searching Contacts");

Ответы [ 2 ]

8 голосов
/ 28 марта 2011

Контакты Lync организованы в группы, поэтому вам нужно начать на уровне групп. После того, как у вас есть группа, вы можете перечислять через ее контакты

foreach(var group in _client.ContactManager.Groups)
{
    foreach (var contact in group)
    {
        MessageBox.Show(contact.Uri);
    }
}

Эта статья хороша для фона и более продвинутых функций

Редактировать : В частности, для вопроса расширения групп рассылки, я думаю, образец здесь имеет недостатки.

Вместо вызова BeginExpand и ожидания в WaitHandle предоставьте метод обратного вызова для обработки обратного вызова Expand. Итак, вместо:

asyncOpResult = DGGroup.BeginExpand(null, null);
asyncOpResult.AsyncWaitHandle.WaitOne();

DGGroup.EndExpand(asyncOpResult);

попробуйте это:

...
asyncOpResult = DGGroup.BeginExpand(ExpandCallback, DGGroup);
...

public void ExpandCallback(IAsyncResult ar)
{
    DistributionGroup DGGroup = (DistributionGroup)ar.AsyncState;
    DGGroup.EndExpand(ar);

    etc...
}

Это прекрасно работает для меня.

1 голос
/ 29 марта 2011

Я закончил несколько поисков, чтобы получить все контакты. Я прохожу каждую букву алфавита, чтобы найти их. Время загрузки достаточно быстрое, и я просто покажу загрузочное изображение на сетке, пока оно не запустится. Это работало хорошо для 200 или около того контактов, которые у нас есть, хотя я бы порекомендовал решение Пола для 150 или меньше. Вот что я сделал:

private static char[] Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
...

public void GetAllContacts()
{
   int initialLetterIndex = 0;

  _lyncClient.ContactManager.BeginSearch(
    Alphabet[initialLetterIndex].ToString();
    SearchProviders.GlobalAddressList,
    SearchFields.FirstName,
    SearchOptions.ContactsOnly,
    300,
    SearchAllCallback
    new object[] { initialLetterIndex, new List<Contact>() }
  );
}

private void SearchAllCallback(IAsyncResult result)
{
  object[] parameters = (object[])result.AsyncState;
  int letterIndex = (int)parameters[0] + 1;
  List<Contact> contacts = (List<Contact>)parameters[1];

  SearchResults results = _lyncClient.ContactManager.EndSearch(result);
  contacts.AddRange(results.Contacts);

  if (letterIndex < Alphabet.Length)
  {
    _lyncClient.ContactManager.BeginSearch(
      Alphabet[letterIndex].ToString(), 
      SearchAllCallback, 
      new object[] { letterIndex, contacts }
    );
  }
  else
  {
    //Now that we have all the contacts 
    //trigger an event with 'contacts' as the event arguments.
  }
}
...