mongo Db неподдерживаемый тип фильтра при использовании Any () или Contains () - есть ли обходные пути / исправления? - PullRequest
0 голосов
/ 20 ноября 2018

Я видел другие темы для такого рода вопроса, но ни один из выделенных ответов не работает для меня.

Кусок кода, который выдает ошибку, выглядит так:

List<Distribution> distributionPublishQueueList = (mongoDb.GetCollection<Distribution>().Find(Builders<Distribution>.Filter.And(
            Builders<Distribution>.Filter.Where(x => x.Status == EntityStatus.Ok),
            Builders<Distribution>.Filter.Where(x => x.IsActive),
            Builders<Distribution>.Filter.Where(x => distinctDistributionIdInPublishQueueList.Contains(x.Id))))).ToList();

Оригинальный код был таким:

List<Distribution> distributionPublishQueueList = 
   (await mongoDb.GetCollection<Distribution>()
       .FindAsync(x => x.Status == EntityStatus.Ok 
                    && x.IsActive
                    && distinctDistributionIdInPublishQueueList.Contains(x.Id)))
      .ToList();

, но я попытался сделать его более дружественным к монго.Обе части кода выше одинаковы.Список DifferentDistributionIdInPublishQueueList - это список идентификаторов распределения, которые являются строками.Поэтому я пытаюсь найти все дистрибутивы, Id которых находится внутри этого списка + два других фильтра.Когда я использую содержимое внутри определения фильтра, оно генерирует исключение Неподдерживаемый фильтр.Но следующий код работает, потому что я перенесу список в локальную память и использую против него LINQ:

List<Distribution> distributionPublishQueueList = (await mongoDb.GetCollection<Distribution>().FindAsync(x => x.Status == EntityStatus.Ok && x.IsActive)).ToList();
distributionPublishQueueList = distributionPublishQueueList.Where(x => distinctDistributionIdInPublishQueueList.Contains(x.Id)).ToList();

Мне нужно иметь возможность этого не делать в локальной памяти из-за количества Распределений, которые присутствуют вбаза данных.Есть ли обходной путь к использованию Contains и Any.Я также попытался использовать MongoCSharpDriver In и Builders.Filter.In и другие варианты.

Пример ошибки может быть следующим.Это код, который используется.

List<Asset> assetList = (await mongoDb.GetCollection<Asset>().FindAsync(
asset => extractAssetsFromContentService.ExtractAssetFromDraftContent(contentAsMarkdown)
.Any(extractedAsset => extractedAsset.AssetId == asset.Id))).ToList();

System.ArgumentException: неподдерживаемый фильтр: Любой (значение (System.Collections.Generic.List`1 [DocWorks.Common.Transformation.Model.ExtractedAssetModel]).Где (({{document} {AssetId} == {document} {_ id}))).

это будет той же ошибкой, за исключением того, что Any будет "Contains", если вместо "any" используется "содержит".Как и в случае с дистрибутивом, я не могу перенести ресурсы в локальную память.Все сущности имеют общий базовый класс, который хранит идентификаторы следующим образом:

 [BsonRepresentation(BsonType.ObjectId)]
 public string Id { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...