【问题标题】:RavenDB Nested Object Projection from Static Index来自静态索引的 RavenDB 嵌套对象投影
【发布时间】:2017-09-20 16:37:53
【问题描述】:

如果我在 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();

我在设置 State 属性的位置返回结果,但 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 请求中发送了正确的点分隔路径,而不是下划线分隔的损坏路径。

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

【问题讨论】:

    标签: c# ravendb nosql


    【解决方案1】:

    您要求 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);
       }
    }
    

    【讨论】:

    • 谢谢!为什么我不需要存储 State 属性,但我需要存储 FirstName?即使我删除了排序,我仍然总是能恢复它的价值。是否与它是枚举类型而不是字符串有关?
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多