Я использую Универсальный репозиторий Mongo , который является просто оболочкой для официального драйвера Mongo DB для C #. Каждая запись в моей базе данных является сложным объектом, который содержит вложенные объекты. Я хочу отфильтровать и отсортировать все записи, используя свойство одного из вложенных объектов . Он работает, как и ожидалось, с помощью Mongo Query Builder, но не работает с LINQ. Можно ли использовать LINQ для вложенных объектов в БД Mongo?
Модель
public interface IGroup : IDocument
{
IQuote Quote { get; set; }
IOption Option { get; set; }
}
public class CGroup : Document, IGroup
{
public IQuote Quote { get; set; }
public IOption Option { get; set; }
}
public interface IOption : IDocument
{
double Bid { get; set; }
double Ask { get; set; }
double Strike { get; set; }
}
public class COption : Document, IOption
{
public double Bid { get; set; }
public double Ask { get; set; }
public double Strike { get; set; }
}
Рабочий запрос с использованием точка-нотация
var filter = Builders<IGroup>.Filter.Gt<double>("Option.Bid", 0);
var x1 = GetCollection<IGroup>(symbol).Find(filter).ToList();
Сбой запроса с использованием LINQ
var x2 = GetCollection<IGroup>(symbol).Find(o => o.Option.Bid > 0).ToList();
При неудачном запросе я получаю эту ошибку.
ExceptionMessage: "{document}.Option.Bid is not supported."
ExceptionType: "System.InvalidOperationException"
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.TranslateComparison(BinaryExpression binaryExpression)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate[TDocument](Expression`1 predicate, IBsonSerializer`1 parameterSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.ExpressionFilterDefinition`1.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.<>c__DisplayClass35_0`1.<FindSync>b__0(IClientSessionHandle session)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
at MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)