В примере II Indexing Related Documents индекс строится над авторами по имени и названию книги. Соответствующие организации выглядят следующим образом:Как индексировать связанные документы в обратном направлении в Ravendb
public class Book {
public string Id { get; set; }
public string Name { get; set; }
}
public class Author {
public string Id { get; set; }
public string Name { get; set; }
public IList<string> BookIds { get; set; }
}
I.e. только Author
содержит информацию об отношении. Эта информация используется при построении указанного индекса.
Но как бы я построил индекс над книгами авторов (предполагая, что книга может иметь несколько авторов)?
Edit:
Книга/автор аналогия идет только до сих пор. Я сделаю пример, который ближе к моей реальной пользы дела:
Предположим, у нас есть некоторые задачи, которые привязаны к местам:
public class Location {
public string Id { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public class Task {
public string Id { get; set; }
public string Name { get; set; }
public string LocationId { get; set; }
public Status TaskStatus { get; set; }
}
у меня есть конечная точка, где подают Locations как GeoJSON на вид карты в клиент. Я хочу покрасить местоположения в зависимости от статуса связанных с ними задач. Карта обычно показывает 500-2000 мест.
Запрос местоположений реализован как потоковый запрос.
Использование запроса-метод, указанный в первоначальном ответе Ayende, я мог бы сделать что-то вроде:
foreach (var location in locationsInView)
{
var completedTaskIds = await RavenSession.Query<Task>()
.Where(t => t.LocationId == location.Id && t.TaskStatus == Status.Completed)
.ToListAsync();
//
// Construct geoJson from location and completedTaskIds
//
}
Это приводит к 500-2000 запросов выполняется против RavenDB, что не кажется правильным. Вот почему я изначально думал, что мне нужен индекс для построения моего результата.
С тех пор я прочитал, что RavenDB кэширует все по умолчанию, так что это может быть не проблема. С другой стороны, реализовав этот подход, я получаю сообщение об ошибке («... максимальное количество запросов (30), разрешенных для этого сеанса ...»).
Что это за хороший способ крепления?
У вас может быть что-то вроде этого? '.Where (t => locationsInView.Any (x => x.Id == t.LocationId) && ....' вместо foreach? – TryingToImprove
Я пробовал это. Но нет. Я думаю, потому что Ворон не может выполнить произвольный C# внутри, поэтому 'locationsInView.Any (...)' не работает. – AdamAL