2013-11-15 105 views

回答

3

這將遍歷數據庫中的所有附件,並一次刪除一個附件。

private void DeleteAllAttachments(IDocumentStore store) 
{ 
    while (true) 
    { 
     var header = store.DatabaseCommands 
      .GetAttachmentHeadersStartingWith("", 0, 1) 
      .FirstOrDefault(); 
     if (header == null) return; 
     store.DatabaseCommands.DeleteAttachment(header.Key, null); 
    } 
} 

您可以通過採用更大的頁面大小來優化它,但由於您無論如何刪除,它可能無關緊要。

1

據我所知,沒有內置的選項來獲取數據庫的所有附件。但您可以執行以下操作:

var client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost:8080"); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*")); 
HttpResponseMessage response = client.GetAsync("databases/YourDatabaseName/static").Result; 
response.EnsureSuccessStatusCode(); 
var files = response.Content.ReadAsAsync<IList<AttachmentInformation>>().Result; 

foreach (var fileDetail in files) 
{ 
    store.DatabaseCommands.DeleteAttachment(fileDetail.Key, null); 
} 

要使用此功能,您需要以下POCO。並參考Microsoft.AspNet.WebApi.Client v5。如果您只是執行ReadAsString並自己或使用其他json解析器解析響應內容,則可以刪除此要求。

public class AttachmentInformation 
{ 
    /// <summary> 
    ///  Gets or sets the size. 
    /// </summary> 
    /// <value>The size.</value> 
    public int Size { get; set; } 

    /// <summary> 
    ///  Gets or sets the key. 
    /// </summary> 
    /// <value>The key.</value> 
    public string Key { get; set; } 

    /// <summary> 
    ///  Gets or sets the metadata. 
    /// </summary> 
    /// <value>The metadata.</value> 
    public object Metadata { get; set; } 

    /// <summary> 
    ///  Gets or sets the etag. 
    /// </summary> 
    /// <value>The etag.</value> 
    public Guid Etag { get; set; } 
} 
+1

不錯的答案,但是函數* does *存在於'GetAttachmentHeadersStartingWith'中,如果您希望它們全部可以使用空字符串。儘管如此,很高興看到一些開箱即用的思想和HTTP API的使用。工作很好。 –