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

本文关键字:嵌套 属性 mongo 查询 linq 使用 | 更新日期: 2023-09-27 18:33:04

我正在尝试使用 linq 查询来过滤来自 Mongo 的结果,但我使用复杂对象的查询都不起作用:

以下工作正常:

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

但这给了我错误:

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

c#驱动程序的2.1.1版本,如果我使用旧版驱动程序,我会得到:

无法确定表达式的序列化信息: p.地址.门牌号

在 MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression 节点, 字典 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 1 collection(
at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source) at Core.Persistence.LegacyMongoDb.LegacyMongoDbImp.<QueryAsync>d__10 1.MoveNext(( 在 C:''Users...''src''Core.Persistence.LegacyMongoDb''LegacyMongoDb.Implementation.cs:line 84

如果我使用当前版本的驱动程序,我会得到:

[地址]。不支持门牌号。

在 MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression 表达式(在 MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(Expression 变量表达式, 表达式类型运算符类型, 常量表达式 常量表达式( 在 MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(BinaryExpression binaryExpression( at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression 节点(在 MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry( at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSkip(SkipExpression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateTake(TakeExpression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression 节点(在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression 节点(在 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 表达式,取消令牌取消令牌( 在 MongoDB.Driver.Linq.MongoQueryableImpl 2.ToCursorAsync(CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__4 1.MoveNext(( --- 从引发异常的先前位置的堆栈跟踪结束 --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务(在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task( at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Core.Persistence.MongoDb.MongoDbImp.<QueryAsync>d__12 1.MoveNext(( 在 C:''Users...''libs''mojio.core''src''Core.Persistence.MongoDb''MongoDb.Implementation.cs:line 68

我超级卡住了,任何正确方向的帮助将不胜感激

编辑:

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; }
}

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

我正在使用复杂的对象对其进行测试,它似乎对我有用。您使用的是哪个版本的 Mongo C# 驱动程序?你能提供更多关于你的复杂对象的细节吗?也许列出这两个对象的属性会有所帮助。