简体   繁体   English

使用c#和linq查询mongo中的嵌套属性

[英]Querying nested properties in mongo with c# and linq

I'm trying to use linq queries to filter results from Mongo, but none of my queries using complex objects work: 我正在尝试使用linq查询来过滤Mongo的结果,但我使用复杂对象的查询都不起作用:

The following works just fine : 以下工作正常:

query.Where(o => (o.Name == "Joe"))

But this gives me errors: 但这给了我错误:

query.Where(o => (o.Address.HouseNumber == "1234"))

With version 2.1.1 of the c# drivers if I use the legacy drivers I get: 对于c#驱动程序的2.1.1版,如果我使用旧版驱动程序,我会得到:

Unable to determine the serialization information for the expression: p.Address.HouseNumber 无法确定表达式的序列化信息:p.Address.HouseNumber

at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary 2 serializationInfoCache) at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node) at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(BinaryExpression binaryExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) at MongoDB.Driver.Linq.PredicateTranslator.BuildAndAlsoQuery(BinaryExpression binaryExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) at MongoDB.Driver.Linq.SelectQuery.BuildQuery() at MongoDB.Driver.Linq.SelectQuery.Execute() at MongoDB.Driver.Linq.MongoQueryProvider.Execute(Expression expression) at MongoDB.Driver.Linq.MongoQueryable 1.GetEnumerator() at System.Collections.Generic.List 1..ctor(IEnumerable MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node,Dictionary 2 serializationInfoCache) at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node) at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(BinaryExpression binaryExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) at MongoDB.Driver.Linq.PredicateTranslator.BuildAndAlsoQuery(BinaryExpression binaryExpression) at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression) at MongoDB.Driver.Linq.SelectQuery.BuildQuery() at MongoDB.Driver.Linq.SelectQuery.Execute() at MongoDB.Driver.Linq.MongoQueryProvider.Execute(Expression expression) at MongoDB.Driver.Linq.MongoQueryable 1.GetEnumerator()在System.Collections.Generic.List 1..ctor(IEnumerable 1..ctor(IEnumerable 1 collection) 1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source) at Core.Persistence.LegacyMongoDb.LegacyMongoDbImp.<QueryAsync>d__10 1.MoveNext() in C:\\Users...\\src\\Core.Persistence.LegacyMongoDb\\LegacyMongoDb.Implementation.cs:line 84 在System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at Core.Persistence.LegacyMongoDb.LegacyMongoDbImp.<QueryAsync>d__10 1.MoveNext()in C:\\ Users ... \\ src \\ Core.Persistence.LegacyMongoDb \\ LegacyMongoDb.Implementation.cs:第84行

If I use the current version of the drivers I get: 如果我使用当前版本的驱动程序,我得到:

[Address].HouseNumber is not supported. [地址]。不支持.HouseNumber。

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.QueryableTranslator.TranslateWhere(WhereExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSkip(SkipExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateT 在MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(表达式表达)在MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(表达式variableExpression,ExpressionType operatorType,常量表达式常量表达式)在MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison (BinaryExpression binaryExpression)位于MongoDB.Driver.Linq.Translators.QueryableTranslator的MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(表达式节点,IBsonSerializerRegistry serializerRegistry)上的MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(表达式节点)。 MongoDB.Driver.Linq.Translator.Linq.Translator.Linq.Translates.Translates.Translates.Translate.Translate.Translate.TranslateSTraip上的MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(TraipExpression节点)中的TranslateWhere(WhereExpression节点)表达式节点)在MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateT ake(TakeExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry) at MongoDB.Driver.Linq.MongoQueryProviderImpl 1.Translate(Expression expression) at MongoDB.Driver.Linq.MongoQueryProviderImpl 1.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken) at MongoDB.Driver.Linq.MongoQueryableImpl 2.ToCursorAsync(CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__4 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.Ha AKE(TakeExpression节点)在MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式节点)在MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression节点)在MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(在MongoDB.Driver.Linq.MongoQueryProviderImpl的MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node,IBsonSerializerRegistry serializerRegistry)上的表达式节点1.在MongoDB.Driver.Linq.MongoQueryProviderImpl上的1.Translate(Expression expression) at MongoDB.Driver.Linq.MongoQueryProviderImpl 1.ExecuteAsync [TResult MongoDB.Driver.Linq.MongoQueryableImpl上的(表达式表达式,CancellationToken cancellationToken)MongoDB.Driver.IAsyncCursorSourceExtensions中的2.ToCursorAsync(CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__4 1.MoveNext()---来自先前位置的堆栈跟踪结束抛出异常---在System.Runtime.CompilerServices.TaskAwaiter.Ha上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) ndleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Core.Persistence.MongoDb.MongoDbImp.<QueryAsync>d__12 1.MoveNext() in C:\\Users...\\libs\\mojio.core\\src\\Core.Persistence.MongoDb\\MongoDb.Implementation.cs:line 68 System.Runtime.CompilerServices.TaskAwaiter上的ndleNonSuccessAndDebuggerNotification(任务任务) 1.GetResult() at Core.Persistence.MongoDb.MongoDbImp.<QueryAsync>d__12 1.MoveNext()位于C:\\ Users ... \\ libs \\ mojio.core \\ src \\ Core.Persistence.MongoDb \\ MongoDb.Implementation.cs:第68行

I'm super stuck any help in the right direction would be appreciated 我很高兴在正确的方向上任何帮助都会受到赞赏

EDIT: 编辑:

public class User : Base<User>, IUser
{
     public string Name { get; set; }
     public IAddress Address { get; set; }
}


public class Address : IAddress
{
     public string HouseNumber { get; set; }
     public string City { get; set; }
     public string Country { get; set; }

}

I'm testing it using complex objects and it seems to be working for me. 我正在使用复杂的对象测试它,它似乎对我有用。 What version of Mongo C# driver are you using? 您使用的是什么版本的Mongo C#驱动程序? Can you give more details about your complex objects? 你能提供有关复杂物体的更多细节吗? Maybe listing the properties of both the objects would help. 也许列出两个对象的属性会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM