[英]Linq filter List base on List of object property
我试图使用Linq筛选数据。 但是我不知道我在哪里做错了。
这是场景:
我有两节课:
public class Category
{
public int Id { get; set; }
public bool Status { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public bool Status { get; set; }
}
这是如何填充类别列表的方法:
var categories = new List<Category>();
for (int i = 1; i <= 5; i++)
{
var category = new Category
{
Id = i,
Status = true
};
categories.Add(category);
}
foreach (var category in categories)
{
var products = new List<Product>();
for (int i = 1; i <= 5; i++)
{
var product = new Product
{
Id = i,
Status = (i % 2 == 0)
};
products.Add(product);
}
category.Products = products;
}
并且我正在尝试获取具有状态为true的产品的类别。
var filter = categories.Where(c => c.Products.Any(p => p.Status)).ToList();
但它也显示了所有产品,甚至是假产品。
我只希望状态为true的各个目录中的那些产品
输出应该是这样的:
category1-> product2, product4
category2 -> product2, product4
category3 -> product2, product4
category4 -> product2, product4
category5 -> product2, product4
您可以尝试使用其status
为真的那些产品来获得类别
var newCategories = categories.Select(
i => new Category {
Id = i.Id,
Status = i.Status,
Products = i.Products.Where(p => p.Status).ToList()
})
.ToList();
编辑如果您为您的Category类添加一个构造函数,如下所示:
public class Category
{
public int Id { get; set; }
public bool Status { get; set; }
public List<Product> Products { get; set; }
public Category(int id, bool status)
{
this.Id = id;
this.Status = status;
}
}
然后,您执行此操作(比上一个更好的代码)
var newCategories = categories.Select(
i => new Category(i.Id, i.Status) {
Products = i.Products.Where(p => p.Status).ToList()
})
.ToList();
您正在显示所有类别,这些类别至少包含一个Product == true 。 因此,将列出在同一类别中具有真正同级产品的所有产品。
这也是因为您基本上不是在查询产品,而是在查询类别。
你可以去:
var products = categories.SelectMany(c => c.Products).Where(p => p.Status).ToList();
在您的代码中,您是通过以下方式添加产品的:
for (int i = 1; i <= 5; i++)
{
var product = new Product
{
Id = i,
Status = (i % 2 == 0)
};
products.Add(product);
}
每个类别中有5个产品,其中2个状态为true。 您正在选择状态至少为==真品的所有类别,即每个类别。
您正在显示状态为true的所有类别的一个或多个产品。 这就是为什么要获得所有这些原因的原因,因为每个类别至少都有一个状态为true的产品。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.