2014-12-01 2 views
2

Если у меня есть статический индекс в RavenDB который выглядит следующим образом:RavenDB Вложенный Объект Проекция от Static Index

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 равны нулю.

Когда я смотрю HTTP-запросы, которые RavenDB отправляет по проводу, я нахожу, что он использует параметр строки запроса: 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, а не сломанный подчеркивание разделило одно.

Как я могу заставить эту проекцию вложенных объектов работать со статическими индексами?

ответ

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); 
    } 
} 
+0

Спасибо! Почему мне не нужно сохранять свойство State, но мне нужно хранить FirstName? Даже если я удалю Сорт, я все равно верну свое значение. Это связано с тем, что это тип Enum, а не строка? –

Смежные вопросы