2013-10-27 150 views
0

我有一組類如下:如何使用linq選擇一個孩子的第一個孩子?

public class ResponseWrapper 
{ 
    public IEnumerable<Book> data { get; set; } 
} 

public class Book 
{ 
    public List<Author> author_data { get; set; } 
    public string isbn13 { get; set; } 
    public string publisher_name { get; set; } 
    public string title { get; set; }   
} 

public class Author 
{ 
    public string name { get; set; } 
    public string id { get; set; } 
} 

Book類包含子作者的項目清單。在我的情況下,我試圖選擇集合中第一個作者項目的'name'屬性。

我想我會用能夠選擇它:

string author = response.data.Where(b => b.author_data.Any()).Select(b => b.author_data.FirstOrDefault().name); 

但這不會編譯,我想這是因爲選擇返回一個集合?我只是想獲得一個結果。

任何人都可以告訴我正確的linq聲明我需要獲得單一的結果我後?

謝謝

+1

移動最後括號中的一個點到左:'response.data.Where(B => b.author_data.Any())選擇(B =。 >(不是在名字後面,而是在FirstOrDefault()後面)。 – bump

回答

2

我認爲你是過於複雜的事情。您只需使用First()FirstOrDefault()即可選擇第一項。

string author = response.data.First().author_data.First().name; 

只是確保你成功爲null雖然。

string author = string.Empty; 
Book firstBook = response.data.FirstOrDefault(); 
if (firstBook != null && firstBook.author_data.Any()) 
{ 
    author = firstBook.author_data.First().name; 
} 
+0

最好使用[DefaultIfEmpty](http://msdn.microsoft.com/en-us /library/bb355419.aspx)方法,以防止不必要* if *。 – galenus

1

嘗試這種

string author = response.data.Where(b => b.author_data.Any()).FirstOrDefault().author_data.FirstOrDefault().name; 
相關問題