返回列表而不是IQueryable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回列表而不是IQueryable相关的知识,希望对你有一定的参考价值。

我有以下表达式:

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

返回一个类型为的对象:

IQueryable<ICollection<ChildAccount>> 

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

List<ChildAccount>

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

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

答案

复制和粘贴

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();

另一答案

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

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

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

另一答案

虽然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,因为我们正在返回聚合结果

以上是关于返回列表而不是IQueryable的主要内容,如果未能解决你的问题,请参考以下文章

返回IQueryable表达式而不执行数据库查询

Android,从其他片段返回的空列表视图

向 IQueryable 添加扩展方法,该方法对列表进行分页并在从 API 控制器方法返回时返回 json 对象

根据字符串名称而不是列表视图项位置替换片段并启动活动

将 IQueryable 转换为简单对象

IQueryable 或 IList