2013-03-03 21 views
8

私は私のコレクションを照会しようとしていますが、私はここでC#foreachループでMongoDBのQueryとQueryBuilderを使用するには?

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

PROBLEM

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

qbAttributesqueryに追加するにはどうすればよいですか?私は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") 
); 

答えて

7

を(私がテストするためにあなたに似たシナリオを持っていないとして)、あなただけに、様々なand条件を追加することができるはずですこのようなコレクション(すなわちIEnumerableを実装する)、及びQueryBuilderインスタンスのAndメソッドに渡し:上記のコードは$andを実行することと等価であるべきである

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 ... 

指定されたすべての条件に適用されます。

+0

配列要素については注意し、配列要素については注意してください。http://docs.mongodb.org/manual/reference/projection/elemMatch/を参照してください。配列の2 "と"の項を使用しても、attrの名前とattrの値が同じ要素内にあるわけではありません。 –

関連する問題