【发布时间】:2014-08-11 11:49:21
【问题描述】:
我正在通过 C# 驱动程序查询 mongodb 集合,但无法提出可以根据每个类别的子类别限制删除项目的 LINQ 表达式。在下面的测试中,如果 Item 属于 Category 22 并且 Item 也属于 SubCategory A 或 B,则不应从查询中返回 Item。
当前编写的测试通过了,但我觉得有更好的方法可以在不使用 foreach 循环的情况下做到这一点。有什么想法吗?
[Test]
public void RemoveItemsBasedOnCategorySubCategoryRestrictions()
{
var restrictionsByCategorySubCategories = new Dictionary<String, List<String>> {
{ "22", new List<String> { "A", "B" } },
{ "32", new List<String> { "A" } }
};
var items = new List<Item> {
new Item { Category = "32", SubCategory = new List<String> { "Z" } },
new Item { Category = "32", SubCategory = new List<String> { "A" } },
new Item { Category = "22", SubCategory = new List<String> { "Z" } },
new Item { Category = "22", SubCategory = new List<String> { "A" } },
new Item { Category = "22", SubCategory = new List<String> { "B" } }
}.AsQueryable();
var results = new List<Item>();
foreach (var restrictionsByCategorySubCategory in restrictionsByCategorySubCategories)
{
var category = restrictionsByCategorySubCategory.Key;
var subCategories = restrictionsByCategorySubCategory.Value;
results.AddRange(items.Where(p => p.Category.Equals(category) && !p.SubCategory.ContainsAny(subCategories)));
}
Assert.That(results.ToList(), Has.Count.EqualTo(2));
foreach (var result in results)
{
Assert.That(result.SubCategory, Is.Not.EqualTo("A"));
Assert.That(result.SubCategory, Is.Not.EqualTo("B"));
}
}
项目:
class Item
{
public String Category;
public List<String> SubCategory;
}
【问题讨论】:
标签: c# linq mongodb mongodb-.net-driver