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")
);
Schreibe einen Kommentar