使用C#和LINQ在Mongo中查询嵌套属性

3

我将尝试使用linq查询来过滤Mongo的结果,但是我的所有使用复杂对象的查询都不起作用:

以下查询可以正常运行:

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

但是这会让我出现错误:
query.Where(o => (o.Address.HouseNumber == "1234"))

使用c#驱动程序的2.1.1版本,如果使用传统驱动程序,会出现以下错误:

“无法确定表达式p.Address.HouseNumber的序列化信息”
“位于MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary2 serializationInfoCache)处”
“在MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)处建立比较查询”
“这是因为无法找到p.Address.HouseNumber的BSON映射定义。 若此字段不存在,请检查对象和其字段名称是否正确。”

如果使用当前版本的驱动程序,则不会发生以上错误。

[Address].HouseNumber不被支持。

在 MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression expression) 处, MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression) 处, MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(BinaryExpression binaryExpression) 处, MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node) 处, MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSkip(SkipExpression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateTake(TakeExpression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node) 处, MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry) 处, MongoDB.Driver.Linq.MongoQueryProviderImpl<code>1.Translate(Expression expression) 处, MongoDB.Driver.Linq.MongoQueryProviderImpl<code>1.ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)处, MongoDB.Driver.Linq.MongoQueryableImpl<code>2.ToCursorAsync(CancellationToken cancellationToken)处, MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__4<code>1.MoveNext() 处。 --- 在上一个引发异常的位置堆栈上的结尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 处, 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 处, 在 System.Runtime.CompilerServices.TaskAwaiter<code>1.GetResult() at Core.Persistence.MongoDb.MongoDbImp.<QueryAsync>d__12<code>1.MoveNext(),位置 C:\Users...\libs\mojio.core\src\Core.Persistence.MongoDb\MongoDb.Implementation.cs: 第 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; }

}
1个回答

0
我正在使用复杂对象进行测试,看起来对我而言是有效的。您使用的是哪个版本的Mongo C#驱动程序?您可以提供关于您的复杂对象的更多细节吗?也许列出这两个对象的属性会有所帮助。

1
它在1.1.1.5版本中无法工作,所以我更新到了2.2.3,并且已经更新了问题,包括有关该对象的详细信息。 - nastassiar
在这种情况下,query是什么? - Shi Her
{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"))} 的翻译如下: - nastassiar
而这是给在代码中同一点工作的人:aggregate([{ "$match" : { "Deleted" : false } }, { "$match" : { "_" : { "$in" : [CSUUID("00000000-0000-0000-0000-000000000000"), CSUUID("00000000-0000-0000-0000-000000000000"), CSUUID("00000000-0000-0000-0000-000000000000)] } } }, { "$match" : { "Name" : "Jerry" } }])} - nastassiar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接