在尝试利用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文档中的示例,但仍然收到了这个结果,所以我对此非常困惑。
答案 0 :(得分:8)
我尝试了你的代码,它对我有用。我可以看到一些你可能会感到困惑的事情。
文档不清楚您必须注册变换器。如果您不这样做,请确保在尝试使用变压器之前使用documentStore.ExecuteTransformer
。
但是,如果你在某个地方调用IndexCreation.CreateIndexes
来扫描要创建的所有索引,它也会选择变换器。那么就没有必要再次注册它了。
您为变换器命名的名称MemberByNameList
是可能用于索引的约定。你可能有一个名为的索引 - 我看到你的查询中有Indexes.MemberByNameList
。
如果您传递索引而不是变换器,那将无效。您应该以描述它们变换的方式命名变换器。也许MiniMemberTransformer
会更好。
当然,Raven可能不在乎你的名字,但这样可以防止你把它误认为是一个索引。
以下a complete test显示了这应该如何运作。