2017-02-16 2 views
0

У меня есть запрос 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, чтобы он индексировался и выполнялся правильно?

ответ

1

Это по дизайну поведение с автоматическими индексами. Вы можете избежать этого поведения, указав свой собственный индекс, который будет генерировать индексную запись для каждого пользователя в документе.

Причина, по которой это поведение по умолчанию для автоматических индексов заключается в том, что в подавляющем большинстве случаев это не имеет значения для пользователя, но на стороне сервера имеет чрезвычайно высокую потенциальную стоимость, поэтому мы хотим, чтобы пользователь для принятия явного решения об этом.

+0

Если у него высокая производительность на стороне сервера, было бы лучше принять результаты запроса как обычно, а затем отфильтровать неверные в C#? –

+0

Нет, стоимость перфекта прекрасна, если вам это действительно нужно, и в основном для индексации. Проблема в том, что если бы мы это сделали по умолчанию, это было бы неправильно. –