Данные в моей коллекции могут иметь пробелы спереди и сзади, что я хочу сделать, это обрезать все пробелы и выполнить сравнение ==, чтобы получить соответствующую запись моего кода ниже:
var test = await _dataStore.FindMostRecentAsync(x => x.Barcodes.PrimaryBarcode.Trim() == barcode.Trim());
Когда я запускаю этот код, он выдает ошибку .Trim()
не поддерживается (он работает только тогда, когда я обрезаю строковую переменную штрих-кода, которую я передаю.
Как лучше всего обрезать данные в моей коллекции, чтобы я мог провести точное сравнение.
Трассировки стека
at MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression expression) at MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression) at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node) at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.MongoCollectionImpl
1.CreateFindOperation[TProjection](FilterDefinition
1 filter, FindOptions2 options) at MongoDB.Driver.MongoCollectionImpl
1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition1 filter, FindOptions
2 options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.<>c__DisplayClass37_0
1.b__0(IClientSessionHandle session) at MongoDB.Driver.MongoCollectionImpl1.UsingImplicitSessionAsync[TResult](Func
2 funcAsync, CancellationToken cancellationToken)
Решение, которое я придумал для этого, состояло в том, чтобы сделать следующее:
var test = await _dataStore.FindMostRecentAsync(x => x.Barcodes.PrimaryBarcode.Contains(barcode.Trim()));
Вместо того, чтобы пытаться обрезать значения, которые существовали в базе данных, я обрежу переменную, а затем сделаю «Содержит», таким образом, я получу все значения, которые соответствуют моему штрих-коду, позже с этим массивом объектов я могу пойти дальше и отфильтровать по дате или что нет.
Я не нашел способа передать метод Trim() для объекта коллекции с помощью C# MongoDriver.
Вам нужно будет использовать агрегатную функцию, чтобы иметь возможность вызывать оператор обрезки.
К сожалению, нет прямого способа вызова через драйвер C#, однако вы можете создать его, используя некоторые BsonDocuments, например:
var barcode = " 1512356 ";
//This exclude the trimmedField from the result.
var projectionDefinition = Builders<BsonDocument>.Projection.Exclude("trimmedField");
//Call the trim operator and put it in the temporary trimmedField property (this trims the barcode on the database)
var expression = new BsonDocument(new List<BsonElement>
{
new BsonElement("trimmedField", new BsonDocument(new BsonDocument("$trim", new BsonDocument("input", "$Barcodes.PrimaryBarcode"))))
});
//Add the trimmedField to the document
var addFieldsStage = new BsonDocument(new BsonElement("$addFields", expression));
//Build a filter on the trimmedField and trim the local variable
var trimFilter = Builders<BsonDocument>.Filter.Eq(x => x["trimmedField"], barcode.Trim());
//Put it all together
var result = collection.Aggregate().AppendStage<BsonDocument>(addFieldsStage).Match(trimFilter).Project(projectionDefinition).As<YourType>().ToList();
Убедитесь, что вы указали правильный тип в .As<T>
, чтобы иметь возможность разыграть сущность.
И если вы добавите [BsonIgnoreExtraElements]
над своим классом, вы сможете отказаться от этапа проецирования.
Вау, я не могу поверить, что все это нужно сделать, чтобы pas в Trim() в выражении agg, я предполагаю, что в конечном итоге они реализуют это как прямой вызов. Спасибо за ваш ответ, я думаю, что люди найдут в нем ценность.