返回列表而不是IQueryable

时间:2018-05-01 07:48:24

标签: c# linq

我有以下表达式:

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

返回类型为

的对象
IQueryable<ICollection<ChildAccount>> 

但是,我需要返回类型:

List<ChildAccount>

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

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

List<ChildAccount>

以上代码应该为您提供SelectMany。在这里,Uncaught ReferenceError: World is not defined展平返回列表列表的查询。例如,您可以看到this Live fiddle

答案 2 :(得分:1)

虽然SelectMany完成了展开集合并从IEnumerable<T>中形成IEnumerable<IEnumerable<T>>的工作,但是如果你需要细粒度控制并想要应用自定义逻辑,那么使用{ {1}}如下:

Aggregate

以下是重要细节:

  1. var a = DBContext.Summaries .Where(fs => fs.PersonID == id) .Select(s => s.ChildAccounts) .Aggregate(new List<ChildAccounts>(), (x,y) => { x.AddRange(y); return x; }); 是最终集合的空种子数据。我们甚至可以根据需要使用第一个元素作为种子数据,然后从第二个元素开始聚合
  2. Lambda中的
  3. new List<ChildAccounts>()参数为x,y,表示外部ICollection<ChildAccounts>的连续元素,并在每次迭代中合并,从而替换种子以供下次执行的数据
  4. 您可以在合并IQueryable时进行自定义处理,但在最终结果上,Aggregate会获取第3个参数List,可用于更改最终集合。
  5. 由于种子数据为Func<TAccumulate,TResult> resultSelector,因此所有中间结果均为List,因为我们正在返回汇总结果

答案 3 :(得分:-9)

复制并粘贴

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

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

如果您想要多列,可以输入

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