Comment utiliser MongoDB, de la Requête et QueryBuilder en c# boucle foreach?

Je suis en train d'interroger mes collections, mais je ne suis pas sûr de la façon de faire "annexer" de toutes sortes de Query.And()

Voici mon modèle de domaine pour créer le Item document:

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

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

La IList<ItemAttribute> de collecte en fonction des changements de ItemTypeTemplate (une sorte de recherche de la clé à une liste prédéterminée de l'élément attributs)

Voici un exemple d'un Item document:

{
    "_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"
     }]
}

LE PROBLÈME

Compte tenu de la "dynamique" de la nature de IList<ItemAttribute>, je ne peux pas spécifier manuellement la requête supplémentaire des conditions de AttributeName et AttributeValue alors j'ai pensé à l'aide d'une boucle pour générer la requête:

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

Comment faire "annexer" qbAttributes à query? J'ai essayé qbAttributes.And(query); mais .Find(query) erreurs avec un argument non valide.

J'ai besoin de quelque chose qui serait comme:

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

OriginalL'auteur Andy Refuerzo | 2013-03-03