返回列表而不是IQueryable

问题描述 投票:0回答:4

我有以下表达式:

var a = DBContext.Summaries
 .Where(fs => fs.PersonID == id)
 .Select(s => s.ChildAccounts);

返回一个类型为的对象:

IQueryable<ICollection<ChildAccount>> 

但是,我需要返回类型为:

List<ChildAccount>

我似乎无法使语法正确。我假设在那里会有一个ToList(),但在我试过的每个地方我都得到了一个不同的,不正确的返回类型。

有人可以建议正确的方法吗?

c# linq
4个回答
-9
投票

复制和粘贴

a = DBContext.Summaries.Where(fs => fs.PersonID == id).Select(s => s.ChildAccounts).ToList();

因此,您将获得带有id条件的Summaries并选择您想要的列。

如果你想要多个列,你可以输入

var a = DBContext.Summaries.Where(fs => fs.PersonID == id).Select(s => new Summaries {ChildAccounts = s.ChildAccounts,....})。ToList();


8
投票

调用SelectMany,它基本上将多个结果列表连接成一个,而不是Select,然后调用ToList

var a = DBContext.Summaries
                 .Where(fs => fs.PersonID == id)
                 .SelectMany(s => s.ChildAccounts)
                 .ToList();

2
投票
var a = DBContext.Summaries
 .Where(fs => fs.PersonID == id)
 .SelectMany(s => s.ChildAccounts).ToList();

上面的代码应该给你的List<ChildAccount>。在这里,SelectMany展平返回列表列表的查询。例如,你可以看到this Live fiddle


1
投票

虽然SelectMany做了扁平化收集并从IEnumerable<T>形成IEnumerable<IEnumerable<T>>的工作,但如果你需要精细的谷物控制并想要应用自定义逻辑,那么使用Aggregate如下:

var a = DBContext.Summaries
                 .Where(fs => fs.PersonID == id)
                 .Select(s => s.ChildAccounts)
                 .Aggregate(new List<ChildAccounts>(),
                            (x,y) => 
                                    {
                                      x.AddRange(y);
                                      return x;    
                                    });

以下是重要细节:

  1. new List<ChildAccounts>()是最终集合的空种子数据。如果需要,我们甚至可以使用第一个元素作为种子数据,并从第二个元素开始聚合
  2. Lambda中的x,y参数是ICollection<ChildAccounts>,它代表外部IQueryable的连续元素,并在每次迭代中合并,从而替换Seed用于下次执行的数据
  3. 您可以在合并List时进行自定义处理,但在最终结果上,Aggregate采用第三个参数Func<TAccumulate,TResult> resultSelector,可用于更改最终集合。
  4. 由于种子数据是List,那么所有中间结果都是List,因为我们正在返回聚合结果
© www.soinside.com 2019 - 2024. All rights reserved.