为什么我的结果类型为List <ienumerable <t>&gt; </ienumerable <t>

时间:2011-08-08 17:07:52

标签: c# .net linq entity-framework entity-framework-4

两个查询应该产生一个帐号列表(字符串)。但是,第二个查询实际返回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();

9 个答案:

答案 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