2016-12-12 129 views
1


MongoDB的C#结合领域

的计划:
所以,现在我基本上要的是把我的propertys了之类的,让用户选择一些再拉只有那些propertys一个列表的MongoDB。

的代码:
这里是该方法开始,其中:

private void DoStuffExecute(object obj) 
     { 
      Class class= new Class(); 
      ExtractClass(class); 

      if (propList != null) 
      { 
       var result = classService.DoStuff(propList); 
      } 
     } 

“ExtractClass()” 的Propertys被拉出类。

void ExtractClass(object obj) 
    { 
     foreach (var item in obj.GetType().GetProperties()) 
     { 
      propList.Add(item.Name); 
     } 
    } 

最后在“classService.DoStuff()”我尝试设置“字段”。

public List<class> DoStuff(List<string> Props) 
      { 
       try 
       { 
        var filter = Builders<class>.Filter.Empty; 

        var fields = Builders<class>.Projection.Include(x => x.ID); 

        foreach (var item in Props) 
        { 
         string str = "x."; 
         str += item.ToString(); 

         fields = Builders<class>.Projection.Include(x => str); 
         fields = Builders<class>.Projection.Include(x => item); 
        } 

        var result = MongoConnectionHandler.MongoCollection.Find(filter).Project<class>(fields).ToList(); 

       return result; 

       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
        var result = new List<class>(); 
        return result; 
       } 
      } 

当我运行它给了我一个PROGRAMM“无法确定X =>值的序列化信息”给它一个字符串...因为即时通讯。

问题: 有没有人有一个想法如何修复上面的代码,甚至使另外一种方式工作?

谢谢。

回答

0

首先:你正在使用这样的代码行:var filter = Builders<class>.Filter.Empty;这是不可能的,因为class是在C#(https://msdn.microsoft.com/en-us/library/x53a06bb.aspx)我想保留关键字,这是你的模型,我会谈论它作为约Model类。

包含过滤器需要Expression作为参数,而不是字符串,您应该构造为一个表达式。这是第二件事。第三,你要结合你的包括作为链,所以你创建包含从字符串列表过滤器的一部分,应该是这样的:

var filter = Builders<Model>.Filter.Empty; 

var fields = Builders<Model>.Projection.Include(x => x.Id); 

foreach (var item in Props) 
{ 
     var par = Expression.Parameter(typeof(Model)); 
     var prop = Expression.Property(par, item); 
     var cast = Expression.Convert(prop, typeof(object)); 
     var lambda = Expression.Lambda(cast, par);           
     fields = fields.Include((Expression<Func<Model, object>>)lambda);    
} 

我都expresiions分开以便更好地理解:首先,创建参数(x=>),比你添加属性(x=>x.Property1),比你应该把它投到object,并且毕竟从它创建Lambda Expression

现在最后一部分:你不需要全部它,包含函数可以获得一个字符串作为参数。所以你可以不用所有的表情来写这个:

fields = fields.Include(item);