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
Vous devez vous connecter pour publier un commentaire.
Bien que non testé (que je n'ai pas un scénario similaire à la vôtre afin de le tester), vous devez être en mesure de simplement ajouter les différents
and
conditions d'une collection (qui implémenteIEnumerable
), comme cela, et puis la passer à laAnd
méthode de laQueryBuilder
exemple:Le code ci-dessus devrait être l'équivalent de l'exécution d'une
$and
sur toutes les conditions spécifiées.OriginalL'auteur WiredPrairie