RavenDB - 变形金刚有奇怪的行为

时间:2013-09-28 16:56:27

标签: ravendb

在尝试利用RavenDB并对查询执行转换时,我会遇到一些奇怪的行为。

假设一个班级Member,那是相当漫长而冗长的......

class Member {
   // ...
   // Lots of properties, methods
}

我只想获得更轻量级的结果。所以我宣布一个较小的班级。

public class MiniMember {
    public string Id { get; set; }
    public string Name { get; set; }
}

并尝试使用AbstractTransformerCreationTask<T>进行查询。

public class MemberByNameList : AbstractTransformerCreationTask<Member> {
    public MemberByNameList() {
        TransformResults = members => from member in members
                                     select new MiniMember {
                                         Id = member.Id,
                                         Name = member.Name
                                     };
    }
}

这在服务器端Studio UI上工作正常,但当我尝试在我的.NET代码中执行此操作时,我遇到了问题。

        var members = DocumentSession
            .Query<Member>()
            .TransformWith<Indexes.MemberByNameList, MiniMember>()
            .Take(512)
            .ToList();

我被告知Member无法投放到课程MiniMember

我已经非常密切地关注了RavenDB文档中的示例,但仍然收到了这个结果,所以我对此非常困惑。

RavenDB Documentation on Result Transformers

1 个答案:

答案 0 :(得分:8)

我尝试了你的代码,它对我有用。我可以看到一些你可能会感到困惑的事情。

  • 文档不清楚您必须注册变换器。如果您不这样做,请确保在尝试使用变压器之前使用documentStore.ExecuteTransformer

    但是,如果你在某个地方调用IndexCreation.CreateIndexes来扫描要创建的所有索引,它也会选择变换器。那么就没有必要再次注册它了。

  • 您为变换器命名的名称MemberByNameList是可能用于索引的约定。你可能有一个名为的索引 - 我看到你的查询中有Indexes.MemberByNameList

    如果您传递索引而不是变换器,那将无效。您应该以描述它们变换的方式命名变换器。也许MiniMemberTransformer会更好。

    当然,Raven可能不在乎你的名字,但这样可以防止你把它误认为是一个索引。

以下a complete test显示了这应该如何运作。