使用 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.List1..ctor(IEnumerable
1 collection(
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 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.MongoQueryableImpl2.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.TaskAwaiter1.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; }
}
我正在使用复杂的对象对其进行测试,它似乎对我有用。您使用的是哪个版本的 Mongo C# 驱动程序?你能提供更多关于你的复杂对象的细节吗?也许列出这两个对象的属性会有所帮助。