Wie zu verwenden MongoDB die Abfrage und den QueryBuilder in c# foreach-Schleife?
Ich versuche Abfrage meiner Sammlungen, aber ich bin mir nicht sicher, wie man ein "Anhängen" von Sorten zu Query.And()
Hier ist mein domain-Modell zu erstellen, das Item
Dokument:
public class Item
{
public ObjectId Id { get; set; }
public string ItemTypeTemplate { get; set; }
public string UsernameOwner { get; set; }
public IList<ItemAttribute> Attributes { get; set; }
}
Den IList<ItemAttribute>
Sammlung ändert sich je nach ItemTypeTemplate
(eine Art lookup-Schlüssel, um eine VORGEGEBENE Liste die Attribute eines Elements)
Hier ist ein Beispiel für einen 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
Angesichts der "dynamischen" Natur der IList<ItemAttribute>
ist, kann ich nicht manuell angeben, die weitere Abfrage der Bedingungen für AttributeName
und AttributeValue
so dachte ich an die Verwendung einer Schleife die Abfrage 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 "append" qbAttributes
zu query
? 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")
);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während ungetestet (da ich don ' T haben ein Szenario ähnlich wie bei Ihnen zu testen mit), sollten Sie in der Lage, fügen Sie einfach die verschiedenen
and
Bedingungen eine Auflistung (implementiertIEnumerable
) so, und dann übergeben es an dieAnd
Methode derQueryBuilder
Beispiel:Der obige code sollte das äquivalent zum durchführen einer
$and
auf allen angegebenen Bedingungen.