Я видел другие темы для такого рода вопроса, но ни один из выделенных ответов не работает для меня.
Кусок кода, который выдает ошибку, выглядит так:
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; }