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