【问题标题】:Querying nested properties in mongo with c# and linq使用 c# 和 linq 查询 mongo 中的嵌套属性
【发布时间】:2016-02-03 23:57:24
【问题描述】:

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

以下工作正常:

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

但这给了我错误:

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

如果我使用的是旧版驱动程序,则使用 2.1.1 版的 c# 驱动程序:

无法确定表达式的序列化信息: p.Address.HouseNumber

在 MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(表达式 节点,Dictionary2 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.MongoQueryable1.GetEnumerator() 在 System.Collections.Generic.List1..ctor(IEnumerable1 集合)
在 System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at Core.Persistence.LegacyMongoDb.LegacyMongoDbImp.<QueryAsync>d__101.MoveNext() 在 C:\Users...\src\Core.Persistence.LegacyMongoDb\LegacyMongoDb.Implementation.cs:line 84

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

[地址].HouseNumber 不受支持。

在 MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(表达式 表达式)在 MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(表达式 variableExpression、ExpressionType operatorType、ConstantExpression 常量表达式)在 MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(BinaryExpression 二进制表达式)在 MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(表达式 节点)在 MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(表达式 节点,IBsonSerializerRegistry serializerRegistry)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSkip(SkipExpression 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateTake(TakeExpression 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式 节点)在 MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式 节点,IBsonSerializerRegistry serializerRegistry)在 MongoDB.Driver.Linq.MongoQueryProviderImpl1.Translate(Expression expression) at MongoDB.Driver.Linq.MongoQueryProviderImpl1.ExecuteAsync[TResult](表达式 表达式,CancellationToken 取消令牌)在 MongoDB.Driver.Linq.MongoQueryableImpl2.ToCursorAsync(CancellationToken cancellationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__41.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Core.Persistence.MongoDb.MongoDbImp.<QueryAsync>d__121.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# mongodb linq


    【解决方案1】:

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

    【讨论】:

    • 它不适用于 1.1.1.5 版本,所以我更新到 2.2.3 并且我更新了问题以包含有关对象的详细信息
    • 在这种情况下,query 是什么?
    • {aggregate([]).Where(p => p.Deleted.Equals(False)).Where(m => m.Index.Any(guid => value(Base`1+ c__DisplayClass7_0[User]).index.Contains(guid))).Where(o => (o.Address.HouseNumber== "1234"))}
    • 这是在代码中同一点工作的那个:aggregate([{ "$match" : { "Deleted" : false } }, { "$match" : { " _" : { "$in" : [CSUUID("00000000-0000-0000-0000-000000000000"), CSUUID("00000000-0000-0000-0000-000000000000"), CSUUID("00000000-0000-000-000 -000000000000)] } } }, { "$match" : { "Name" : "Jerry" } }])}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多