Типобезопасный запрос с условием для вложенного объекта - PullRequest
0 голосов
/ 10 сентября 2018

Я использую Универсальный репозиторий 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)
...