2

为了在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 文档

4

1 回答 1

8

我试过你的代码,它对我有用。尽管您可能会感到困惑,但我可以看到几件事。

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

    但是,如果您在某个地方调用IndexCreation.CreateIndexes扫描所有要创建的索引,它也会拾取转换器。那么就不需要再注册了。

  • 你给你的转换器起的名字,MemberByNameList是一个可能用于索引的约定。您可能有一个名为的索引 - 我看到您Indexes.MemberByNameList的查询中有。

    如果您传递的是索引而不是转换器,那将不起作用。您应该以描述其转换内容的方式命名您的转换器。也许MiniMemberTransformer会更好。

    当然,Raven 可能不太关心你给它起什么名字,但这会防止你把它误认为是索引。

这是一个完整的测试,展示了它应该如何工作。

于 2013-09-28T21:22:25.553 回答