两个查询应该产生一个帐号列表(字符串)。但是,第二个查询实际返回List<IEnumerable<string>>
,我希望它返回List<string>
。我做错了什么?
//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();
答案 0 :(得分: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>
而不是可枚举。
答案 1 :(得分:3)
您的select
子句正在返回/嵌套另一个select
操作,因此您最终会使用嵌套枚举。要展平列表,您需要使用SelectMany
。
var acts = base.context.Accousts
.SelectMany(a => x.AccountNumber)
.ToList();
答案 2 :(得分: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>>
。
答案 3 :(得分:2)
虽然您可以使用SelectMany
,但嵌套from子句更为直接:
var uAccounts = (from u in base.context.Users
from a in u.Accounts
select a.AccountNumber).ToList();
当你使用像NHibernate这样的产品时,你会想知道这个习惯用法,因为它是在生成的SQL代码中进行表连接的一种非常简单的方法。
答案 4 :(得分:1)
在第二个查询中,您正在进行第二个选择,即创建内部列表
这会返回IEnumerable<string>
u.Accounts.Select(s => s.AccountNumber)
然后你将它包装在另一个创建外部列表
的选择中答案 5 :(得分:1)
我想我需要使用u.Accounts.SelectMany(...)
来获得所需的结果。
答案 6 :(得分:1)
u.Accounts.Select(s => s.AccountNumber)
是帐号
的列表所以
(from u in base.context.Users
select u.Accounts.Select(s => s.AccountNumber))
是IEnumerable的帐号列表
添加.ToList()
将其列为帐号列表
答案 7 :(得分:0)
在第二种情况下,ToList()
仅适用于外部列表,外部列表本身由列表组成。
答案 8 :(得分: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