2013-03-03 4 views
8

Ich versuche, meine Sammlung zu fragen, aber ich bin nicht sicher, wie ein „anhängen“ der Art zu tun ist, um Query.And()Wie verwende ich den Query und QueryBuilder von MongoDB in der C# foreach-Schleife?

Hier mein Domain-Modell das Item-Dokument zu erstellen:

public class Item 
{ 
    public ObjectId Id { get; set; } 
    public string ItemTypeTemplate { get; set; } 
    public string UsernameOwner { get; set; } 

    public IList<ItemAttribute> Attributes { get; set; } 
} 

Die IList<ItemAttribute> Sammlung ändert sich je nach ItemTypeTemplate (eine Art einer Lookup-Schlüssel zu einem vorher festgelegten Liste der Attribute eines Artikel)

Hier ist eine Probe eines Item Dokument:

{ 
    "_id" : ObjectId("5130f9a677e23b11503fee72"), 
    "ItemTypeTemplate" : "Tablet Screens", 
     //can be other types like "Batteries", etc. 
     //which would change the attributes list and values 
    "UsernameOwner" : "user032186511", 
    "Attributes" : [{ 
     "AttributeName" : "Screen Size", 
     "AttributeValue" : "10.1" 
    }, { 
     "AttributeName" : "Pixel Density", 
     "AttributeValue" : "340" 
    }] 
} 

DAS PROBLEM

die „dynamische“ Natur IList<ItemAttribute> Da kann ich nicht manuell die zusätzliche Abfragebedingungen für AttributeName angeben und AttributeValue so dachte ich, eine Schleife mit der Abfrage zu erstellen:

QueryBuilder<Item> qbAttributes = new QueryBuilder<Item>(); 

foreach (var attribute in item.Attributes) 
{ 
    qbAttributes.And(
     Query.EQ("Attributes.AttributeName", attribute.AttributeName), 
     Query.EQ("Attributes.AttributeValue", attribute.AttributeValue), 
    ); 
} 

var query = Query.And(
    Query.EQ("TemplateId", item.TemplateId), 
    Query.NE("UsernameOwner", item.UsernameOwner) 
); 

return DBContext.GetCollection<Item>("Items").Find(query).AsQueryable(); 

Wie kann ich "qbAttributes" an query anhängen? Ich habe versucht qbAttributes.And(query);, aber .Find(query) Fehler mit einem ungültigen Argument.

Ich brauche etwas, das wäre wie:

var query = Query.And(
    Query.EQ("ItemTypeTemplate", item.ItemTypeTemplate),  //Tablet Screens 
    Query.NE("UsernameOwner", item.UsernameOwner)    //current user 

    // this part is generated by the loop 

    Query.EQ("Attributes.AttributeName", "Screen Size"), 
    Query.EQ("Attributes.AttributeValue", "10.1"), 

    Query.EQ("Attributes.AttributeName", "Pixel Density"), 
    Query.EQ("Attributes.AttributeValue", "340") 
); 

Antwort

7

Während ungetestet (wie ich mit nicht ein Szenario ähnlich wie bei Ihnen zu testen), sollten Sie in der Lage sein, nur die verschiedenen and Bedingungen in der eine Sammlung wie folgt aus (die IEnumerable implementiert), und gibt sie dann an die And Verfahren der QueryBuilder Beispiel:

var andList = new List<IMongoQuery>(); 

foreach (var attribute in item.Attributes) 
{ 
    andList.Add(Query.EQ("Attributes.AttributeName", attribute.AttributeName)); 
    andList.Add(Query.EQ("Attributes.AttributeValue", attribute.AttributeValue)); 
} 

andList.Add(Query.EQ("TemplateId", item.TemplateId)); 
andList.Add(Query.NE("UsernameOwner", item.UsernameOwner)); 

var query = new QueryBuilder<Item>(); 
query.And(andList); 
// do something with query ... 

der obige Code entspricht, um die Durchführung einer $and sein sollten auf allen angegebenen Bedingungen.

+0

Achten Sie auf Array-Elemente, und achten Sie auf Array-Elemente, und schauen Sie sich http://docs.mongodb.org/manual/reference/projection/elemMatch/ an. die Verwendung von 2 "und" Termen für ein Array bedeutet nicht, dass Attr-Name und Attr-Wert innerhalb desselben Elements auftreten. –

Verwandte Themen