让我们假设我有以下索引:
public class PostsForList: AbstractIndexCreationTask<Post, PostsForList.ReduceResult>
{
public class ReduceResult
{
public string Id { get; set; }
public string Title { get; set; }
public long CommentsCount { get; set; }
}
public PostsForList()
{
Map = posts => from post in posts
select
new
{
Id = post.Id,
Title = post.Title,
CommentsCount = post.Comments,
};
}
}
如果我执行它,RavenDb不仅会返回Id,Title和CommentsCount,还会返回整个Post文档。但我不需要整个文档(让我们想象它包含很多其他内容)。
正如我所说,现在有两种解决方案:
那么为什么没有更自然的解决方案(或者我可能只是不知道它)?这是一个概念性的解决方案吗?
答案 0 :(得分:2)
您可以使用RavenDB的Projections feature进行转换。
这只是在RavenDB将其从doc存储中拉出后改变了Json doc的形状,因此字段不必标记为Stored
才能使其工作
public PostsForList()
{
Map = posts => from post in posts
select
new
{
Id = post.Id,
Title = post.Title,
CommentsCount = post.Comments,
};
TransformResults =
(database, posts) => from post in posts
select new { post.Id, post.Title, post.CommentsCount };
}
当您查询此索引时,您仍需要我们.As<new type>
,否则RavenDB会抱怨。像这样:
session.Query<Post, PostTitleCommentsCount>()
.Where(x => x.Title == "blah")
.As<PostTitleCommentsCount>()
.ToList();
它最常用于允许连接,有关详细信息,请参阅this blog post ,但也适用于此方案。