2013-11-15 2 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

Хороший ответ, но эта функция *. * Существует, в 'GetAttachmentHeadersStartingWith', которая может принимать пустую строку, если вы хотите их всех. Тем не менее, приятно видеть какое-то готовое мышление и использование HTTP api. Хорошая работа. –

Смежные вопросы