我正在尝试查询我的收藏品,但我不确定如何对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>
的“动态”特性,我无法手动指定AttributeName
和AttributeValue
的其他查询条件,因此我想使用循环来构建查询:
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")
);
答案 0 :(得分:7)
虽然未经测试(因为我没有类似于你的场景进行测试),但您应该能够将各种and
条件添加到集合(实现IEnumerable
)之类的这个,然后将其传递给And
实例的QueryBuilder
方法:
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
。