将不同的文档索引到RavenDb中的同一个对象

时间:2013-09-30 22:21:57

标签: c# .net ravendb

我正在索引2个不同的文档,如下所示。

public class User
{
    public UserId UserId { get; set; }
    public string DisplayName { get; set; }
}

public class UserGroup
{
    public UserGroupId UserGroupId { get; set; }

    public string Name { get; set; }
}

//this is for indexing result
public class SecurityObject
{
    public virtual Guid Id { get; set; }

    public virtual string DisplayName { get; set; }

    public virtual SecurityObjectType ObjectType { get; set; }
}

我的查询如下。正如您在Index配置中看到的那样,我将Name属性映射到DisplayName,但当返回的文档为DisplayName时,null属性为UserGroup。当我查看提取的文档Name属性未映射到DisplayName属性时,实际值仍保留在Name属性上。如何在Name上将DisplayName属性正确转换为UserGroup属性?

_session.Query<SecurityObject, SecurityObjectIndex>()
    .Where(s => s.DisplayName.StartsWith(searchTerm))
    .ProjectFromIndexFieldsInto<SecurityObject>();

这是我的索引配置:

public class SecurityObjectIndex
    : AbstractMultiMapIndexCreationTask<SecurityObject>
{
    public override string IndexName
    {
        get
        {
            return "UserAndUserGroup/SecurityObjectIndex";
        }
    }

    public SecurityObjectIndex()
    {
        AddMap<User>(users => from u in users
                              select new
                              {
                                  DisplayName = u.DisplayName,
                                  ObjectType = SecurityObjectType.Users
                              });

        AddMap<UserGroup>(userGroups => from u in userGroups
                                        select new 
                                      { 
                                          DisplayName = u.Name,
                                          ObjectType = SecurityObjectType.Groups
                                      });
    }
}

1 个答案:

答案 0 :(得分:0)

要从索引字段进行投影,必须使用索引存储这些字段。将以下内容添加到索引定义中:

Store(x=> x.DisplayName, FieldStorage.Yes);
Store(x=> x.ObjectType, FieldStorage.Yes);

或者,您可以使用此快捷方式:

StoreAllFields(FieldStorage.Yes);

但我个人更喜欢单独标记每一个。