C# 为什么我的类型列表结果是

C# 为什么我的类型列表结果是,c#,.net,linq,entity-framework,entity-framework-4,C#,.net,Linq,Entity Framework,Entity Framework 4,两个查询应生成帐号字符串列表。然而,第二个查询实际上返回一个列表,我希望它返回一个列表。我做错了什么 //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>

两个查询应生成帐号字符串列表。然而,第二个查询实际上返回一个列表,我希望它返回一个列表。我做错了什么

//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();
改变

实际上,为了回答您的问题,您的两行代码之间的区别在于,第一行代码遍历每个帐户并仅选择帐户号。第二条语句选择IEnumerable的嵌入式Linq查询。因此,您正在转换为这些IEnumerable的列表

这实际上显示了我不确定如何在查询语句中使用它的好处。SelectMany方法将通常接收到的IEnumerable展平为T元素的单个枚举。因此,当调用ToList时,它将返回一个列表,而不是可枚举项。

更改

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

实际上,为了回答您的问题,您的两行代码之间的区别在于,第一行代码遍历每个帐户并仅选择帐户号。第二条语句选择IEnumerable的嵌入式Linq查询。因此,您正在转换为这些IEnumerable的列表


这实际上显示了我不确定如何在查询语句中使用它的好处。SelectMany方法将通常接收到的IEnumerable展平为T元素的单个枚举。因此,当调用ToList时,它将返回一个列表,而不是可枚举列表。

在第二种情况下,ToList只应用于外部列表,外部列表本身由列表组成。

在第二种情况下,ToList只应用于外部列表,外部列表本身由列表组成。

在第二个查询中,您正在进行第二次选择,这将创建您的内部列表

这将返回一个IEnumerable


然后将其包装到另一个选择中,创建外部列表

在第二个查询中,您正在执行第二个选择,创建内部列表

这将返回一个IEnumerable

然后你将它包装在另一个选择中,创建外部列表

我想我需要使用美国帐户。选择多个。。。要获得所需的结果。

我想我需要使用u.Accounts。选择Many。。。以获得所需的结果。

u.Accounts.Selects=>s.AccountNumber本身为您提供一个IEnumerable

然后在base.context.Users select u.Accounts.Selects=>s.AccountNumber中将其从u包装为IEnumerable

然后调用该列表上的.ToList。

u.Accounts.Selects=>s.AccountNumber本身将为您提供一个IEnumerable

然后在base.context.Users select u.Accounts.Selects=>s.AccountNumber中将其从u包装为IEnumerable

然后调用.ToList打开该列表。

u.Accounts.Selects=>s.AccountNumber

是一个帐号列表

所以

是帐号列表的IEnumerable

添加.托利斯

使其成为帐号列表

u.Accounts.Selects=>s.AccountNumber

是一个帐号列表

所以

是帐号列表的IEnumerable

添加.托利斯

使其成为帐号列表

您的select子句正在返回/嵌套另一个select操作,因此您将以嵌套枚举结束。要展平列表,您需要改用SelectMany

var acts = base.context.Accousts
  .SelectMany(a => x.AccountNumber)
  .ToList();
您的select子句正在返回/嵌套另一个select操作,因此您将以嵌套枚举结束。要展平列表,您需要改用SelectMany

var acts = base.context.Accousts
  .SelectMany(a => x.AccountNumber)
  .ToList();
u、 Accounts.Selects=>s.AccountNumber返回IEnumerable

选择u.Accounts.Selects=>s.AccountNumber返回IEnumerable

选择u.Accounts.Selects=>s.AccountNumber.ToList;只需将外部IEnumerable转换为IList

u.Accounts.Selects=>s.AccountNumber返回IEnumerable

选择u.Accounts.Selects=>s.AccountNumber返回IEnumerable

选择u.Accounts.Selects=>s.AccountNumber.ToList;只需将外部IEnumerable转换为IList即可

虽然您可以使用SelectMany,但嵌套from子句更为简单:

var uAccounts = (from u in base.context.Users
                  from a in u.Accounts
                    select a.AccountNumber).ToList();
当您使用NHibernate这样的产品时,您会想知道这个习惯用法,因为它是在生成的SQL代码中进行表联接的一种非常简单的方法。

虽然您可以使用SelectMany,但嵌套from子句更简单:

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

当您使用NHibernate这样的产品时,您会想知道这个习惯用法,因为它是在生成的SQL代码中进行表联接的一种非常简单的方法。

您的select子句中有一个内部LINQ查询,该查询返回IEnumerable,因此,在外部查询中,您正在将所有IEnumerable排序为IEnumerable,然后再将其转换为列表。我如何重写该查询以获得所需的结果?select子句中有一个返回IEnumerable的内部LINQ查询,因此在外部查询中您正在排序
在将IEnumerable转换为列表之前,将所有IEnumerable转换为IEnumerable。如何重写该查询以获得所需结果?关闭,但需要选择的是外部选择,而需要选择的是外部选择
var uAccounts = (from u in base.context.Users
                  from a in u.Accounts
                    select a.AccountNumber).ToList();