You are currently browsing legacy 4.1 version of documentation. Click here to switch to the newest 5.0 version.

We can help you with migration to the latest RavenDB

Contact Us Now
see on GitHub

Indexes: Indexing Attachments

The AttachmentsFor method returns a list of attachments in a given document as well as basic information like Name or Size about each of them.

IEnumerable<AttachmentName> AttachmentsFor(object doc);
public string Name;

public string Hash;

public string ContentType;

public long Size;

Creating an index using AttachmentsFor()

The AttachmentsFor method is available in AbstractIndexCreationTask.

public class Employees_ByAttachmentNames : AbstractIndexCreationTask<Employee>
{
    public class Result
    {
        public string[] AttachmentNames { get; set; }
    }

    public Employees_ByAttachmentNames()
    {
        Map = employees => from e in employees
                           let attachments = AttachmentsFor(e)
                           select new Result
                           {
                               AttachmentNames = attachments.Select(x => x.Name).ToArray()
                           };
    }
}

Querying the index

//return all employees that have an attachment called "cv.pdf"
List<Employee> employees = session
    .Query<Employees_ByAttachmentNames.Result, Employees_ByAttachmentNames>()
    .Where(x => x.AttachmentNames.Contains("cv.pdf"))
    .OfType<Employee>()
    .ToList();
//return all employees that have an attachment called "cv.pdf"
List<Employee> employees = await asyncSession
    .Query<Employees_ByAttachmentNames.Result, Employees_ByAttachmentNames>()
    .Where(x => x.AttachmentNames.Contains("cv.pdf"))
    .OfType<Employee>()
    .ToListAsync();
//return all employees that have an attachment called "cv.pdf"
List<Employee> employees = session
    .Advanced
    .DocumentQuery<Employee, Employees_ByAttachmentNames>()
    .ContainsAny("AttachmentNames", new[] { "cv.pdf" })
    .ToList();