具有嵌套对象条件的类型安全查询

时间:2018-09-10 19:52:34

标签: mongodb-.net-driver

我正在使用Generic Mongo Repository,它只是C#官方Mongo DB驱动程序的包装。我数据库中的每条记录都是一个包含嵌套对象的复杂对象。我想使用其中一个嵌套对象的属性过滤并排序所有记录。它可以使用Mongo Query Builder正常运行,但不适用于LINQ。可以在Mongo DB中的嵌套对象上使用LINQ吗?

模型

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; }
} 
使用dot-notation

有效查询

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)

0 个答案:

没有答案
相关问题