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

时间:2017-05-17 13:15:11

标签: c# list linq

我尝试使用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;
 }

我正在尝试将产品的类别设置为status = true。

var filter = categories.Where(c => c.Products.Any(p => p.Status)).ToList();

但它也显示了所有产品,甚至是假产品。

我只希望相应目录中的那些产品具有status = true

输出应该是这样的:

category1-> product2, product4
category2 -> product2, product4
category3 -> product2, product4
category4 -> product2, product4
category5 -> product2, product4

4 个答案:

答案 0 :(得分:4)

您可以尝试使用这些产品获取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();

答案 1 :(得分:3)

您正在显示所有类别,其中包含至少一个产品== true 。因此,将列出在同一类别中具有真实兄弟的每个产品。

这也是因为你基本上不是在查询产品而是分类。

你可以去:

var products = categories.SelectMany(c => c.Products).Where(p => p.Status).ToList();

答案 2 :(得分:2)

在您的代码中,您将以这种方式添加产品:

for (int i = 1; i <= 5; i++)
{
    var product = new Product
    {
       Id = i,
       Status = (i % 2 == 0)
    };
    products.Add(product);
 }

每个类别中有5个产品,其中2个产品的状态为true。您正在选择至少具有一个status == true产品的所有类别,即每个类别。

答案 3 :(得分:1)

您使用状态为true的一个或多个产品显示所有类别。 这就是为什么你得到所有这些因为每个类别至少有一个状态为真的产品。