2011-08-08 60 views
1

兩個查詢應導致一個帳號(字符串)的列表。然而,第二個查詢實際返回一個List<IEnumerable<string>>,我希望它返回一個List<string>。我究竟做錯了什麼?爲什麼我的結果類型列表<IEnumerable <T>>

//the type here resolves to List<string> 
var acts = (from a in base.context.Accounts 
      select a.AccountNumber).ToList(); 

//the type here resolves to List<IEnumerable<string>> 
var uAccounts = (from u in base.context.Users 
       select u.Accounts.Select(s => s.AccountNumber)).ToList(); 
+1

你有你'select'子句中的內部LINQ查詢返回的IEnumerable'',所以在你的外部查詢您整理所有的IEnumerable'' s到一個'的IEnumerable >'轉彎前它成了一個列表。 – BoltClock

+0

我將如何重寫該查詢以實現我想要的結果? – e36M3

回答

3

變化

var uAccounts = (from u in base.context.Users 
      select u.Accounts.Select(s => s.AccountNumber)).ToList(); 

var uAccounts = base.context.Users.SelectMany(u => 
       u.Accounts.Select(s => s.AccountNumber)).ToList(); 

而要真正回答你的問題,你的代碼的兩行之間的區別在於,第一個經過的每一個帳戶,只選擇帳號。第二條語句選擇IEnumerable<string>的嵌入式Linq查詢。因此,你正在轉換爲這些的List<T>IEnumerable<string>

這實際上顯示了SelectMany extention method(我真的不確定如何在查詢語句中使用它)的好處。 SelectMany方法將您通常會收到的IEnumerable<T>平鋪爲單個枚舉的T元素。所以當調用ToList()時,它將返回一個List<string>而不是枚舉值。

0

在第二種情況下,ToList()僅適用於外部列表,該列表本身由列表組成。

1

在第二個查詢,你正在做第二個選擇是創造您的內部列表

這將返回IEnumerable<string>

u.Accounts.Select(s => s.AccountNumber) 

,然後你在另一個包裝它選擇創建外部列表

1

我想我需要用u.Accounts.SelectMany(...)才能得到想要的結果。

+0

關閉,但它的外部選擇需要成爲'SelectMany' – Davy8

2

u.Accounts.Select(s => s.AccountNumber)本身給你一個IEnumerable<string>

然後在from u in base.context.Users select u.Accounts.Select(s => s.AccountNumber)包裝,給你一個IEnumerable<IEnumerable<string>>

然後調用.ToList()就可以得到List<IEnumerable<string>>

1

u.Accounts.Select(s => s.AccountNumber)

是帳號列表

所以

(from u in base.context.Users 
    select u.Accounts.Select(s => s.AccountNumber)) 

是賬號

列表添加.ToList()

使得它的IEnumerable賬戶號碼列表

3

您的select子句正在返回/嵌套另一個select操作,因此最終得到嵌套的枚舉。要展平列表,您需要改爲使用SelectMany

var acts = base.context.Accousts 
    .SelectMany(a => x.AccountNumber) 
    .ToList(); 
0

u.Accounts.Select(s => s.AccountNumber)返回IEnumerable<string>

select u.Accounts.Select(s => s.AccountNumber)返回IEnumerable<IEnumerable<string>>

select u.Accounts.Select(s => s.AccountNumber)).ToList();剛剛轉外的IEnumerable到IList中

2

雖然你可以使用SelectMany,它是更直接地窩您從條款:

var uAccounts = (from u in base.context.Users 
        from a in u.Accounts 
        select a.AccountNumber).ToList(); 

當你使用像NHibernate這樣的產品時,你會想知道這個習慣用法,因爲它是在結果SQL代碼中進行表連接的一種非常直接的方式。

相關問題