繁体   English   中英

Linq过滤器基于对象属性列表的列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM