【发布时间】:2012-01-27 16:00:06
【问题描述】:
我读过很多次 RavenDb 在查询期间不做任何计算。例如这里引用了 Ayende 的文章 "The Pain of Implementing LINQ Providers"
RavenDB 的一个特点是它绝对不会执行 查询期间的计算;查询的所有数据已经 准备好了。这意味着我们可以实现非常好的查询速度。
但同时有实时投影功能,允许在查询期间进行一些计算。比如这里我使用排序和求和计算:
TransformResults = (database, post) => from post in posts
order by post.DateTime
select new
{
Id = post.Id,
CommentsCount = post.Comments.Sum()
}
所以 RavenDb 允许动态计算,不是吗?
更新。我决定再提供一个示例,您实际上必须在查询期间计算(排序)事物。任务:为特定的 BlogId 选择 10 个最后发表的 cmets(假设我们的博客系统上有很多博客):
public class LastPostsCommentsIndex: AbstractIndexCreationTask<Post>
{
public class IndexResult
{
public string BlogId {get; set;}
}
public class PostComment
{
public string PostId { get; set; }
public DateTime DateTime { get; set; }
public string Author { get; set; }
public string Text { get; set; }
}
public LastPostsCommentsIndex()
{
Map = posts => from post in posts
select new { BlogId = post.BlogId };
TransformResults = (database, posts) => from post in posts
from comment in post.Comments
orderby comment.DateTime descending
select new { PostId = post.Id, DateTime = comment.DateTime, Author = comment.Author, Text = comment.Text };
}
}
在这种情况下,我们无法对地图索引结果进行排序 - 我们必须即时对结果进行排序。
【问题讨论】: