RavenDB Nested Object Projection from Static Index

本文关键字:Static Index from Projection Nested Object RavenDB | 更新日期: 2023-09-27 18:32:30

如果我在RavenDB中有一个静态索引,如下所示:

public class TestIndex : AbstractIndexCreationTask<CardApplication>
{
   public TestIndex()
   {
        Map = apps =>
            from app in apps
            select new { State = app.State, };
        Sort(c => c.State, Raven.Abstractions.Indexing.SortOptions.String);
   }
}

然后我尝试使用以下方法查询它:

session.Query<CardApplication, TestIndex>()
    .OrderBy(c => c.State)
    .Select(c => new { c.State, c.IdentityDetails.Applicant.FirstName, })
    .ToList();

我在设置状态属性的位置得到结果,但 FirstName 属性均为空。

当我查看RavenDB通过网络发送的HTTP请求时,我发现它正在使用查询字符串参数:fetch=IdentityDetails_Applicant_FirstName。如果我将其修改为fetch=IdentityDetails.Applicant.FirstName并重新发出请求,我会得到正确的结果(至少在返回的 JSON 中我可以看到 FirstName 结果)。

如果我使用动态索引执行类似的查询:

session.Query<CardApplication>()
    .OrderBy(c => c.State)
    .Select(c => new { c.State, c.IdentityDetails.Applicant.FirstName, })
    .ToList();

我得到了正确的结果,我注意到RavenDB在HTTP请求中发送了正确的点分隔路径,而不是断开的下划线分隔路径。

如何让此嵌套对象投影与静态索引一起使用?

RavenDB Nested Object Projection from Static Index

您要求 RavenDB 从索引中获取属性,因此您需要实际指定属性。使用以下索引:

public class TestIndex : AbstractIndexCreationTask<CardApplication>
{
   public TestIndex()
   {
        Map = apps =>
            from app in apps
            select new { State = app.State, IdentityDetails_Applicant_FirstName = app IdentityDetails.Applicant.FirstName};
        Sort(c => c.State, Raven.Abstractions.Indexing.SortOptions.String);
 Store("IdentityDetails_Applicant_FirstName", FieldStorage.Yes);
   }
}