2016-12-12 2 views
1


MongoDB C# Kombination Felder

Der Plan:
So, jetzt, was ich will im Grunde ist meine propertys aus der Klasse zu nehmen, damit der Benutzer einige holt und dann nur mit dem propertys aus einer Liste ziehen von MongoDB.

Der Code:
hier ist, wo die Methode beginnt:

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

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

in "ExtractClass()" die Propriétés werden aus der Klasse gezogen.

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

und schließlich in "classService.DoStuff()" Ich versuche, die "Felder" zu setzen.

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; 
       } 
      } 

wenn ich laufe das Programm es gibt mir ein „Kann die Serialisierungsinformationen für x => Wert bestimmen,“ ... da im ihm einen String geben.

Die Frage: Hat jemand eine Idee hat, wie oben den Code zu reparieren oder sogar den Plan der Arbeit in einer anderen Art und Weise machen?

danke.

Antwort

0

Zu allererst: Sie solche Codezeilen verwenden wie: var filter = Builders<class>.Filter.Empty; es nicht möglich ist, weil class ein reserviertes Schlüsselwort in C# ist (https://msdn.microsoft.com/en-us/library/x53a06bb.aspx) Ich nehme an, es ist Ihr Modell, und ich werde darüber wie über Model Klasse sprechen .

Include Filter Bedürfnisse Expression als Parameter, nicht eine Zeichenfolge, sollten Sie als Ausdruck konstruieren ist. Das ist die zweite Sache. Drittens sollten Sie enthält als eine Kette kombinieren, also Ihrerseits Filter aus string Liste Fügen Sie schaffen sollte folgendermaßen aussehen:

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);    
} 

Ich habe alle expresiions zum besseren Verständnis trennen: zuerst Sie Parameter erstellen (x=>), als Sie fügen Eigenschaft hinzu (x=>x.Property1), als Sie es auf object werfen sollten, und schließlich Lambda Expression davon erstellen.

Und jetzt der letzte Teil: Sie brauchen nicht alles davon, Include-Funktion könnte jsut eine Zeichenfolge als Parameter erhalten. Also könntest du statt aller Ausdrucke folgendes schreiben:

fields = fields.Include(item);  
Verwandte Themen