Conventions: Querying

FindPropertyNameForIndex and FindPropertyNameForDynamicIndex

These two conventions specify functions that are used to find the indexed property name for a static index or a dynamic one. This can be useful when you are indexing nested properties of complex types. Their default implementations are:

FindPropertyNameForIndex = (indexedType, indexName, path, prop) =>
    (path + prop).Replace(",", "_").Replace(".", "_"),

FindPropertyNameForDynamicIndex = (indexedType, indexName, path, prop) => path + prop,

The arguments in the order of appearance: an indexed document type, an index name, a current path and a property path.

FindProjectionPropertyNameForIndex

This convention specifies a function that is used to find the projected property name for a static index.
This can be useful when you want to use a static index to project nested properties which are not Stored.

public Func<Type, string, string, string, string> FindProjectedPropertyNameForIndex

Same as in the two conventions above, the arguments in the order of appearance: an indexed document type, an index name, a current path and a property path.

By default FindProjectionPropertyNameForIndex is set to null.
When FindProjectionPropertyNameForIndex is null (or returns null), the FindPropertyNameForIndex convention is used instead.

Example

Consider we have the following index, and we want to project School.Id:

private class UsersIndex : AbstractIndexCreationTask<User>
{
    public UsersIndex()
    {
        Map = users => from user in users
            select new
            {
                SchoolId = user.School.Id
            };
    }
}

Without setting FindProjectedPropertyNameForIndex, FindPropertyNameForIndex will be used :

var query = session.Query<User, UsersIndex>()
    .Where(u => u.School.Id != null)
    .Select(u => u.School.Id)
    .ToList();
from index 'UsersIndex'
where School_Id != null
select School_Id

School_Id is indexed but not Stored, meaning that we will try to fetch School_Id from the document - which doesn't have this property.

Setting the FindProjectedPropertyNameForIndex convention can solve this issue:

Conventions =
{
    FindProjectedPropertyNameForIndex = (indexedType, indexName, path, prop) => path + prop
}

var query = session.Query<User, UsersIndex>()
    .Where(u => u.School.Id != null)
    .Select(u => u.School.Id)
    .ToList();
from index 'UsersIndex'
where School_Id != null
select School.Id