C# 如何在MongoDB文档中从字典中的对象检索属性?

C# 如何在MongoDB文档中从字典中的对象检索属性?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我们的Mongo数据如下所示: { "_id" : ObjectId("542d881b8bc641bbee1f8509"), "ExtendedProperties" : { "Context" : { "_t" : "LoggingContext", "DeclaringTypeName" : "EndpointConfig"

我们的Mongo数据如下所示:

{
        "_id" : ObjectId("542d881b8bc641bbee1f8509"),
        "ExtendedProperties" : {
                "Context" : {
                        "_t" : "LoggingContext",
                        "DeclaringTypeName" : "EndpointConfig"
                }
        }
}
在C#代码中,扩展属性表示如下:

public class LogEntry
{
    public IDictionary<string, object> ExtendedProperties { get; set; }
}
公共类日志条目
{
公共IDictionary ExtendedProperties{get;set;}
}
我已经尝试了我能找到的每一种方法来查询DeclaringTypeName的值。似乎什么都不起作用,如以下代码所示:

// This throws an UnsupportedOperationException with the following message:
// Unable to determine the serialization information for the expression: (LogEntry e) => e.ExtendedProperties.get_Item("DeclaringTypeName").ToString().
query.Add(Query<LogEntry>.EQ(e => ((LoggingContext)e.ExtendedProperties["Context"]), this.DeclaringTypeName ));

// This returns zero matching rows:
query.Add(Query.EQ("ExtendedProperties.Context.DeclaringTypeName", this.DeclaringTypeName));

// This returns zero matching rows:
query.Add(Query.ElemMatch("ExtendedProperties.Context", Query.EQ("DeclaringTypeName", this.DeclaringTypeName)));

// This reports that ExtendedProperties must implement a specific interface and must not return null:
query.Add(Query<LogEntry>.ElemMatch(e => e.ExtendedProperties, qb => Query.EQ("Context.DeclaringTypeName", this.DeclaringTypeName)));
//这会抛出一个UnsupportedOperationException,并显示以下消息:
//无法确定表达式的序列化信息:(LogEntry e)=>e.ExtendedProperties.get_Item(“DeclaringTypeName”).ToString()。
query.Add(query.EQ(e=>((LoggingContext)e.ExtendedProperties[“Context”]),this.DeclaringTypeName));
//这将返回零个匹配行:
Add(query.EQ(“ExtendedProperties.Context.DeclaringTypeName”,this.DeclaringTypeName));
//这将返回零个匹配行:
Add(query.ElemMatch(“ExtendedProperties.Context”,query.EQ(“DeclaringTypeName”,this.DeclaringTypeName));
//这报告ExtendedProperties必须实现特定接口,并且不能返回null:
Add(query.ElemMatch(e=>e.ExtendedProperties,qb=>query.EQ(“Context.DeclaringTypeName”,this.DeclaringTypeName));
为了清楚起见,我已经研究了我能找到的每一个StackOverflow、CodePlex和Mongo.org线程,但至今无法正确解决这个问题

当然,这将是我做错的事情


有人请扔我一根骨头。

我将LogEntry类定义为

public class LogEntry
{
    public ObjectId Id { get; set; }
    public IDictionary<string, object> ExtendedProperties { get; set; }
}

我得到了结果

第二个应该很好用。我会回去看看是否还有其他问题(可能不是生成您认为是的查询)。什么query.Add(…做什么?(什么是query?)@disper:query是一个列表,所以它只是将它添加到现有的imongquery对象列表中,这些对象稍后会传递到query.and()。我使用var rawQuery=query.EQ得到了结果(“ExtendedProperties.Context.DeclaringTypeName”、“EndpointConfig”);var query=new List();query.Add(rawQuery);var rawResult=collection.Find(rawQuery.ToList();你确定这个.DeclaringTypeName是“EndpointConfig”吗?这是赢家。结果证明我没有通过我想通过的。谢谢!
var log = new LogEntry
{
    ExtendedProperties = new Dictionary<string, object>
    {
        {
            "Context", new LoggingContext
            {
                DeclaringTypeName = "EndpointConfig"
            }
        }
    }
};

collection.Insert(log);
var rawQuery = Query.EQ("ExtendedProperties.Context.DeclaringTypeName", "EndpointConfig");
var query = new List<IMongoQuery>();
query.Add(rawQuery);

var rawResult = collection.Find(rawQuery).ToList();
db.messages.find({ "ExtendedProperties.Context.DeclaringTypeName" : "EndpointConfig" })