RavenDB - 检索部分文档

tpx*_*x86 15 ravendb

我正在玩Raven DB几天,我想将它用作我的Web聊天应用程序的存储空间.我有包含一些用户数据和聊天记录的文档 - 这是大收集聊天消息.

每次加载用户文档时,聊天记录也会被加载,即使我只需要几个字段,如:用户名,密码和电子邮件.

我的问题是:如何只从数据库加载部分文件?

Aye*_*ien 31

托梅克,

您无法加载部分文档,但可以加载投影.

session.Query<User>()
   .Where(x=>x.Name == name)
   .Select( x=> new { x.Name, x.Email });
Run Code Online (Sandbox Code Playgroud)

这将只加载适当的字段

  • 它将返回一个匿名对象,而不是动态类型.你也可以做新的MyObject {Name = x.Name,Email = x.Email} (6认同)

小智 5

据我所见,您可以执行此操作(基于上面的原始“用户”场景):

public class UserSummary
{
    public string Name { get; set; }
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

documentSession.Query<User>().AsProjection<UserSummary>();
Run Code Online (Sandbox Code Playgroud)

查看 Raven 服务器,它会将以下内容作为查询的一部分输出:

?query=&pageSize=128&fetch=Name&fetch=Email&fetch=Id
Run Code Online (Sandbox Code Playgroud)

所以看起来它只查询并返回原始对象的子集,这很好。

这也有效:

documentSession.Query<User>().Select( x=> new User { Name = x.Name, Email= x.Email })
Run Code Online (Sandbox Code Playgroud)

但我认为这不像返回 UserSummary 对象那么干净。

对那些发布回复的人提出一些后续问题:

RaccoonBlog 的链接有以下示例:

https://github.com/ayende/RaccoonBlog/blob/master/RaccoonBlog.Web/Infrastruct/Indexes/PostComments_CreationDate.cs

该方法会优于 .AsProjection() 吗?这两种方法有什么区别?