8

コレクションにクエリを実行しようとしていますが、コレクションに「追加」する方法がわかりませんQuery.And()

Itemドキュメントを作成するためのドメイン モデルは次のとおりです。

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

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

コレクションは、(アイテムの属性の事前定義されたリストへのある種のルックアップ キー) にIList<ItemAttribute>応じて変化します。ItemTypeTemplate

Itemドキュメントのサンプルを次に示します。

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

問題

の「動的」な性質を考えるとIList<ItemAttribute>、追加のクエリ条件を手動で指定することはできないためAttributeNameAttributeValueループを使用してクエリを作成することを考えました。

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

qbAttributesに「追加」するにはどうすればよいqueryですか? 試してみましたが、無効な引数でエラーqbAttributes.And(query);が発生しました。.Find(query)

次のようなものが必要です:

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

1 に答える 1

8

andテストされていない間 (テストするシナリオに似たシナリオがないため)、次のようにコレクション (を実装する) にさまざまな条件を追加し、それをインスタンスのメソッドにIEnumerable渡すことができるはずです。AndQueryBuilder

var andList = new List<IMongoQuery>();

foreach (var attribute in item.Attributes)
{
    andList.Add(Query.EQ("Attributes.AttributeName", attribute.AttributeName));
    andList.Add(Query.EQ("Attributes.AttributeValue", attribute.AttributeValue));
}

andList.Add(Query.EQ("TemplateId", item.TemplateId));
andList.Add(Query.NE("UsernameOwner", item.UsernameOwner));

var query = new QueryBuilder<Item>();
query.And(andList);
// do something with query ...

上記のコードは$and、指定されたすべての条件で を実行するのと同等である必要があります。

于 2013-03-03T19:11:21.777 に答える