2016-09-30 106 views
0

我有一个元素列表。我需要在类别名称为“XYZ”的每个属性上使用筛选器来获取所有元素。如何使用C#过滤列表LINQ

以下查询明确地对属性进行筛选以选择类别名称为“XYZ”的属性,但我也希望获得这些筛选属性的元素详细信息。

var filteredAttributes = attributes.Where(at => at.Categories.Any(ca => ca.Name == "XYZ")).Any()).ToList(); 

但是,如果我对元素执行相同的过滤器,则会获取所有元素上没有过滤器的属性。 是否可以创建一个单行查询来过滤元素以获取必要的属性?

这LINQ查询我想这会失败:

var filteredElements = elements.Where(el => el.attributes.Where(at => at.Categories.Any(ca => ca.Name == "Alarm")).Any()).ToList(); 

这里有定义的类:

public class Element 
{ 
    public string Name { get; set; } 
    public string ID { get; set; } 
    public Boolean HasChildren { get; set; } 
    public List<Attribute> Attributes { get; set; } 
} 
    public class Attribute 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Value { get; set; } 
    public string WebID { get; set; } 
    public List<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 
+2

“失败”是什么意思?异常抛出还是不是预期的结果? – Fabio

+0

你为什么限制为单行lambdas?这样做可能会妨碍可读性和可维护性。 – Cameron

+0

是不是像'var filteredElements = elements.Where(el => el.attributes.Any(ca => ca.Name ==“Alarm”))'? – 2016-09-30 19:28:49

回答

1

只要把你的第一个查询里面的elements
Where我认为它会足够使用Any的属性与内部Any类别

var filteredElements = 
    elements.Where(el => 
    { 
     return el.attributes.Any(at => at.Categories.Any(ca => ca.Name.Equals("Alarm"))); 
    }).ToList(); 
+0

这在功能上等同于第一个OP提供的作为' Any()'将接受'Where()'过滤器并且行为相同。 – krillgar

+0

@krillgar在第一个例子中,OP写了缺失的元素......它看起来像元素是属性的父母...... OP应该澄清 – 2016-09-30 19:37:13

+0

@ Fabio-我试过同样的事情。它不起作用。您的解决方案与 elements.Where(el => el.attributes.Where(at => at.Categories.Any(ca => ca.Name ==“Alarm”))。Any())。ToList( ); – Ramji