Click or drag to resize

ISearchAsyncSearchAsync Method

IT Hit WebDAV Classes Reference
Returns a list of items that correspond to a search request.

Namespace:  ITHit.WebDAV.Server.Search
Assembly:  ITHit.WebDAV.Server (in ITHit.WebDAV.Server.dll) Version: 9.1.5460-Beta
Task<PageResults> SearchAsync(
	string searchString,
	SearchOptions options,
	List<PropertyName> propNames,
	Nullable<long> offset,
	Nullable<long> nResults


Type: SystemString
A phrase to search.
Type: ITHit.WebDAV.Server.SearchSearchOptions
Search parameters.
Type: System.Collections.GenericListPropertyName
List of properties to retrieve with each item returned by this method. They will be requested by the Engine in GetPropertiesAsync(IListPropertyName, Boolean) call.
Type: SystemNullableInt64
The number of items to skip before returning the remaining items.
Type: SystemNullableInt64
The number of items to return.

Return Value

Type: TaskPageResults
Instance of PageResults class that contains items on a requested page and total number of items in search results.

This method is called by DavEngineAsync when client application is sending search request. In your implementation you must return a list of items that correspond to the requested search phrase and options.

The search phrase may contain wildcards:

  • To indicate one or more characters the '%' is passed in search string.
  • To indicate exactly one character the '_' is passed in search string.

To include '%', '_' and '\' characters in the search string thay are escaped with '\' character.

Note that IT Hit Ajax File Browser is using '*' and '?' as wildcard characters. In case included in search they are replaced with '%' and '_'.


The code below is part of 'WebDAVServer.FileSystemStorage.AspNet' C# & VB samples provided with the SDK.

public async Task<PageResults> SearchAsync(string searchString, SearchOptions options, List<PropertyName> propNames, long? offset, long? nResults)
    bool includeSnippet = propNames.Any(s => s.Name == snippetProperty);

    // search both in file name and content
    string commandText =
        @"SELECT System.ItemPathDisplay" + (includeSnippet ? " ,System.Search.AutoSummary" : string.Empty) + " FROM SystemIndex " +
        @"WHERE scope ='file:@Path' AND (System.ItemNameDisplay LIKE '@Name' OR FREETEXT('""@Content""')) " +
        @"ORDER BY System.Search.Rank DESC";

    commandText = PrepareCommand(commandText,
        "@Path", this.dirInfo.FullName,
        "@Name", searchString,
        "@Content", searchString);

    Dictionary<string, string> foundItems = new Dictionary<string, string>();
        // Sending SQL request to Windows Search. To get search results file system indexing must be enabled.
        // To find how to enable indexing follow this link:
        using (OleDbConnection connection = new OleDbConnection(windowsSearchProvider))
        using (OleDbCommand command = new OleDbCommand(commandText, connection))
            using (OleDbDataReader reader = command.ExecuteReader())
                while (await reader.ReadAsync())
                    string snippet = string.Empty;
                    if (includeSnippet)
                        snippet = reader.GetValue(1) != DBNull.Value ? reader.GetString(1) : null;
                    foundItems.Add(reader.GetString(0), snippet);
    catch (OleDbException ex) // explaining OleDbException
        context.Logger.LogError(ex.Message, ex);
        switch (ex.ErrorCode)
            case -2147217900: throw new DavException("Illegal symbols in search phrase.", DavStatus.CONFLICT);
            default: throw new DavException("Unknown error.", DavStatus.INTERNAL_ERROR);

    IList<IHierarchyItemAsync> subtreeItems = new List<IHierarchyItemAsync>();
    foreach (string path in foundItems.Keys)
        IHierarchyItemAsync item = await context.GetHierarchyItemAsync(GetRelativePath(path)) as IHierarchyItemAsync;
        if (includeSnippet && item is DavFile)
            (item as DavFile).Snippet = HighlightKeywords(searchString.Trim('%'), foundItems[path]);


    return new PageResults(offset.HasValue && nResults.HasValue ? subtreeItems.Skip((int)offset.Value).Take((int)nResults.Value) : subtreeItems, subtreeItems.Count);
See Also