MongoDb C#驱动程序是否适用于LINQ和动态文档?

时间:2013-12-28 20:49:57

标签: c# .net linq mongodb mongodb-.net-driver

我想知道我是否甚至可以在未映射且完全动态的mongo文档上使用LINQ。原因是我有ITEM aggrigator,它包含未知的键和值。这只是我之所以选择no-sql解决方案的唯一原因,因为EAV + SQL看起来很慢并且过度。

我在我的test集合中插入了超过1m的文档,其中oneten字段中包含随机数据。现在,我正在尝试将其取回并使用本机Mongo查询,当然。使用LINQ并不是那么多。我在这里做错了吗?

错误

  

mscorlib.dll中发生未处理的“System.FormatException”类型异常

     

其他信息:输入字符串的格式不正确。

代码

private static List<BsonDocument> Get(string query)
{
    var client = new MongoClient("mongodb://localhost");
    var server = client.GetServer();
    var db = server.GetDatabase("test");
    var collection = db.GetCollection("items");
    var collectionQuery = collection.AsQueryable();

    var result = collection.Find(Query.EQ("Six", 7962)).ToList(); // THIS WORKS
    //var result = collection.AsQueryable().Where(x => x["Six"] == 7962).ToList(); // ERROR

    return result;
}

2 个答案:

答案 0 :(得分:3)

驱动程序目前不支持动态类型。这是它的jira票: https://jira.mongodb.org/browse/CSHARP-539

还有一篇关于一些可能的解决方法的有趣帖子: http://roysvork.wordpress.com/2013/04/22/using-linq-to-query-loosely-typed-data-in-mongodb/

答案 1 :(得分:0)

看起来版本1.10.0的驱动程序支持LINQ查询中的动态文档。也就是说,我已经能够执行这样的查询:

        var collection = database.GetCollection("items");
        var query =
            from e in collection.AsQueryable()
            where e["string_property"] == "a_value"
            select e;

        foreach (var c in query)
        {
            Console.WriteLine(c["another_property"]);
        }

官方文档C# Driver LINQ Tutorial似乎只包含使用域对象的示例,并且基于1.8版。

以上代码适用于1.10.0。我无法确定何时向驱动程序添加了对上述代码的确切支持。