使用动态构建的LINQ搜索MongoDB集合

时间:2014-01-19 19:32:01

标签: c# linq mongodb

我有一个网络表单,用户可以动态添加文本字段。然后,他可以将数据输入到这些文本字段中并提交表单,然后将其保存到MongoDB。

然后我想从MongoDB中检索一些数据。但我不知道该怎么做。

通常我会事先定义entity类。类似的东西:

public class User
{
    public string Name {get;set;}
    public int Age {get;set;}
}

然后我通常会有一些能够从MongoDB中检索数据的存储库类。

var userRepo = new Repository<User>();
var user = userRepo.Where(x => x.Name == "something");

但是由于这些表单字段是动态构建的,所以我无法在编译时为它定义class

因此在这种情况下使用我的repo类不会起作用:

var someRepo = new Repository<What_To_Put_Here?>();

这意味着我不能使用方便的LINQ表达式,因为MongoDB中的集合不代表我的代码中的任何类。

我不知道我的新模式应该如何通过我的Repository类来搜索MongoDB。我仍然喜欢以某种方式使用LINQ来搜索(动态构建)集合。

无论如何我能解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

由于您在编译时不知道类型及其属性,因此不能使用LINQ。当然你可以做一些疯狂的事情来使用LINQ(想到反思......),但这不会让事情变得更好,只会更糟。如果在编译时不知道数据模式,那么使用编译时帮助程序是没有意义的。

使用查询构建器(using MongoDB.Driver.Builders)代替,例如类似的东西:

db.GetCollection("CollectionName").Find(Query.EQ("MyFieldName", value));

优点是它允许动态构建查询,缺点是它没有强类型,所以你可能会不小心要求一个甚至不存在的字段,但这个问题是动态类型所固有的。

使用键值对而不是将用户的架构映射到实际的mongodb架构可能是个好主意,例如:使用{ "form" : "foo", "customValues" : [ { "key" : "domain", "value" : "acme.com"}, ... ] }而不是实际添加像{ "form" : "foo", "domain" : "acme.com" }这样的字段,因为后者不会将数据与他们的数据分开,容易发生冲突,数据迁移方案很难并且无法索引。