返回列表而不是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;
});
以下是重要细节:
new List<ChildAccounts>()
是最终集合的空种子数据。如果需要,我们甚至可以使用第一个元素作为种子数据,并从第二个元素开始聚合- Lambda中的
x,y
参数是ICollection<ChildAccounts>
,它代表外部IQueryable
的连续元素,并在每次迭代中合并,从而替换Seed用于下次执行的数据 - 您可以在合并
List
时进行自定义处理,但在最终结果上,Aggregate采用第三个参数Func<TAccumulate,TResult> resultSelector
,可用于更改最终集合。 - 由于种子数据是
List
,那么所有中间结果都是List
,因为我们正在返回聚合结果
以上是关于返回列表而不是IQueryable的主要内容,如果未能解决你的问题,请参考以下文章