Фильтр NOT IN в запросе с объединением двух коллекций с использованием драйвера MongDB C # - PullRequest
0 голосов
/ 08 мая 2018

У меня есть две коллекции, которые можно смоделировать с помощью этих классов (упрощенная версия):

public class Profile
{
    [BsonId]
    [BsonRepresentation(BsonType.String)]
    public Guid? Id { get; set; }
    public string Name { get; set; }        
    [BsonRepresentation(BsonType.String)]
    public Guid UserId { get; set; }
}

public class User
{
    [BsonId]
    [BsonRepresentation(BsonType.String)]
    public Guid? Id { get; set; }
    public string UserName { get; set; }        
    public bool IsConfirmed { get; set; }        
}

Мне нужен запрос, чтобы получить все UserProfiles, у которых User имеет флаг IsConfirmed, равныйtrue, а затем мне нужно отфильтровать те, чей Id включен в список исключенных Id:

IList<Guid> profileIdsToExclude

Это запрос, который я построил до сих пор:

var professionalProfilesQuery = 
    (from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable()
     join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()
     on profileCollection.UserId equals userCollection.Id.Value
     into users
     orderby profileCollection.Name
     select new ProfessionalProfile
     {
         Id = profileCollection.Id,
         Name = profileCollection.Name,                                                 
         UserId = profileCollection.UserId,
         IsConfirmed = users.First().IsConfirmed,                                                 
     })
     .Where(p => p.IsConfirmed && !profileIdsToExclude.Contains(p.Id.Value));

Где ProfessionalProfile - это класс для возврата результата запроса:

public class ProfessionalProfile
{
    public Guid? Id { get; set; }
    public string Name { get; set; }        
    public Guid UserId { get; set; }
    public bool IsConfirmed { get; set; }        
}

Я получаю UserProfiles, только те, у которых IsConfirmed равно true.Но те, чей Id находится в списке исключенных Id, не отфильтровываются и возвращаются запросом.

Есть идеи, возможно ли то, что я хочу сделать, и как?

Заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

Ваша проблема здесь вызвана небольшой путаницей типов.

Запрос, который создает драйвер, в конце содержит этап $match, который выглядит примерно так:

{
    $match: {
        IsConfirmed: true,
        Id: {
            $nin: [ BinData(3, "DBA38D51FC28094BA2D6439E95643A49") ]
        }
    }
}

Таким образом, он на самом деле пытается исключить результаты с полем с определенным значением Guid. Однако вы сохраняете строки для ваших направляющих, поэтому фильтр ничего не исключает. Чтобы это исправить, вот что вы могли бы сделать:

Изменение

.Where(p => p.IsConfirmed && !profileIdsToExclude.Contains(p.Id.Value));

в

.Where(p => p.IsConfirmed && !profileIdsToExclude.Contains(p.Id));

и

IList<Guid> profileIdsToExclude

в

IList<Guid?> profileIdsToExclude
...