2016-09-30 94 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