У меня есть запрос RavenDB, который ищет активных пользователей в документе.RavenDB Любой запрос на дочерние объекты возвращает неверные результаты
Нормальный запрос выглядит следующим образом:
var documents = session.Query<Document>().Where(d => d.Users.Any(u => u.Id == UserId && u.Active == true)).ToList();
автоматически сгенерированный запрос выглядит следующим образом:
from doc in docs.Documents
select new {
Users_Active = (
from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
select docUsersItem.Active).ToArray(),
Users_Id = (
from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
select docUsersItem.Id).ToArray()
}
Однако это приводит к тому, запросу, возвращающий документ, в котором есть правильный пользователь, но пользователь неактивен, так как в документе есть еще один активный пользователь.
Я подозреваю, что это потому, что поля индексируются в результате, как:
AssignedUsers_Id: [1, 2]
AssignedUsers_Active:[false, true]
И запрос будет соответствовать Id в массиве, и правда, в активном массиве, даже если они находятся на разных индексов в их соответствующих массивов.
Какие изменения необходимо внести в индекс, чтобы получить это, чтобы возвращать только документы, у которых UserId правильный И активен?
Чтобы избежать этого в будущем с автоматическими индексами, можно ли каким-либо образом переписать мой запрос LINQ, чтобы он индексировался и выполнялся правильно?
Если у него высокая производительность на стороне сервера, было бы лучше принять результаты запроса как обычно, а затем отфильтровать неверные в C#? –
Нет, стоимость перфекта прекрасна, если вам это действительно нужно, и в основном для индексации. Проблема в том, что если бы мы это сделали по умолчанию, это было бы неправильно. –