Моя цель — прочитать driveItemId
из Document-ID
.
Document-ID
— это уникальный столбец SharePoint, который присваивается каждому файлу в библиотеке SharePoint.
Я попробовал использовать этот метод ниже, чтобы получить driveItem
(по его driveItemId
), используя поиск по запросу:
public async Task<string> GetDriveItemIdAsync(string driveId, string docId)
{
try
{
var query = $"Dokument-ID:{docId}";
var results = await _graphClient.Drives[driveId].SearchWithQ(query).GetAsSearchWithQGetResponseAsync();
if (results.Value.Count == 1)
{
_logger.Info($"Found one document with documentId '{docId}' in drive '{driveId}'.");
return results.Value.FirstOrDefault().Id;
}
else if (results.Value.Count == 0)
{
_logger.Info($"No document with documentId '{docId}' found in drive '{driveId}'.");
throw new Exception($"No document with documentId '{docId}' found in drive '{driveId}'.");
}
else
{
var driveItemId = results.Value.FirstOrDefault().Id;
var message = "Dokumente: \n";
foreach (var item in results.Value)
{
message += $"Name: {item.Name}, Id: {item.Id}\n";
}
_logger.Error($"More than one document with documentId '{docId}' found in drive '{driveId}'. Returning the first item with driveItemId == '{driveItemId}' \n{message}");
MessageBox.Show($"Mehr als ein Dokument mit der DocumentId '{docId}' in Laufwerk '{driveId}' gefunden. Melden Sie sich sofort bei der IT und zeigen Sie diese Fehlermeldung. \n{message}", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
return driveItemId;
}
}
catch (ServiceException ex)
{
_logger.Error($"Error while trying to get last version of item with documentId '{docId}' in drive '{driveId}'. Exception: '{ex}'");
throw;
}
}
Я еще не совсем понял запрос: с некоторыми входными данными documentID
я вообще не получаю обратно ни одного элемента, а с другими я получаю гораздо больше, чем просто один элемент, даже если столбец documentID
вообще не соответствует.
Он ведет себя очень странно, возможно, потому, что мой запрос еще неверен.
Спасибо за вашу помощь, я также открыт для лучшего решения для получения driveItemId
by DocumentID
в библиотеке SharePoint.
Редактировать:
Использование фильтра тоже может быть решением, но я думаю, что ответ в этом посте больше недействителен, в документации ничего об этом не нашел.
Вы пробовали приведенный выше запрос? Это для одного документа для получения диска. Запрос
Я попробовал. var results = await _graphClient.Drives[driveId].SearchWithQ($"{docId}").GetAsSearchWithQGetResponseAsync();
Это почти так же, как в моем коде в вопросе, и ведет себя очень странно. Иногда он возвращает больше, чем просто нужный мне элемент диска.
Да, он возвращает больше информации, вам просто нужно изменить код, чтобы вернуть идентификатор.
Я знаю, но он возвращает список объектов DriveItem, у которых даже нет этого DocumentId. Иногда возвращается около 50 товаров. Возможно, потому, что он также ищет содержимое файла. Это запрос, который я использовал:{https://graph.microsoft.com/v1.0/drives/{driveId}/search(q='{DocumentId}')}
Хорошо, но когда я попробовал в своей среде, он вернул только определенный элемент
Странно, я работаю с библиотекой шаблонов документов Word и шаблоны очень близки друг к другу, иногда шаблон создается на основе другого шаблона в библиотеке. Поэтому я хочу искать только DocumentId
в столбце SharePoint, поскольку это единственное уникальное поле. Я попробую решение из ответа ниже.
Я бы использовал конечную точку v1.0/search/query
, чтобы найти listItem
по documentId
. Насколько я помню, вам действительно нужен listItem
id. Важное documentId
связано с listItem
, а не с driveItem
.
using Microsoft.Graph.Search.Query;
using Microsoft.Graph.Models;
var documentId = "7NDKNNDUE4VT-1387038990-1"
var requestBody = new QueryPostRequestBody
{
Requests = new List<SearchRequest>
{
new SearchRequest
{
EntityTypes = new List<EntityType?>
{
EntityType.ListItem,
},
Query = new SearchQuery
{
QueryString = $"dlcDocId:{documentId}",
},
},
},
};
var result = await graphClient.Search.Query.PostAsQueryPostResponseAsync(requestBody);
if (result.Value[0].HitsContainers[0].Hits[0].Resource is ListItem listItem)
{
var siteId = listItem.ParentReference.SiteId;
var listId = listItem.SharepointIds.ListId;
var listItemId = listItem.SharepointIds.ListItemId;
}
Если вы хотите ограничить поиск определенным сайтом и библиотекой документов:
"queryString": "dlcDocId:7NDKNNDUE4VT-1387038990-1 AND path:\"https://contoso.sharepoint.com/sites/{site_name}/{library_name}\""
Не является ли поиск по всему SharePoint медленным, если посмотреть на производительность? Можно ли искать только на Сайте или в Библиотеке документов?
Определенно, вы можете ограничить поиск конкретным сайтом, я обновлю ответ
Поиск только по DocumentId
работает нормально, но при попытке добавить такой путь я больше не получаю никаких результатов. QueryString = $"dlcDocId:{docId} AND path:'https://{_domain}/sites/{siteName}/{libraryName}'",
Я абсолютно уверен, что переменные _domain, siteName и LibraryName верны.
Я также заметил, что listItemId
всегда появляется в конце DocumentId
, отделенный символом -
. DocumentId = "{prefix}-{some chars that are identical in this library}-{listItemId}"
Это намеренно со стороны SharePoint? Это также позволило бы мне перейти непосредственно к listId без необходимости вызова API.
Путь @EliahThommen должен быть заключен в двойные кавычки. QueryString = $"dlcDocId:{docId} И путь:\"https://{_domain}/sites/{siteName}/{libraryName}\""
@EliahThommen Что касается последней части DocumentId, у меня ее нет, похоже, что последнее число увеличивается автоматически, но я не уверен, что оно должно было быть таким же, как listItemId. Но вам все равно нужен идентификатор списка, верно?
Да, последнее число увеличивается автоматически. Я только что заметил, что это число всегда совпадает с listItemId и его можно удалить с помощью разделения строк. Это просто заметное явление, я не уверен, что это закономерно. Еще раз спасибо за помощь, двойные кавычки устранили проблему с путем.
@EliahThommen Я имею в виду случай, когда документ перемещается из одной библиотеки в другую. DocumentId должен оставаться прежним, но после перемещения документа последняя часть DocumentId не будет совпадать с идентификатором элемента списка в новой библиотеке.
В моей ситуации это не вариант использования.
Чтобы получить DriveItemID, используйте этот запрос
https://graph.microsoft.com/v1.0/drives/DriveID/root/search(q='DocumentID')
, и возвращаемый идентификатор — это DriveItemID.