我有以下表达式:
var a = DBContext.Summaries
.Where(fs => fs.PersonID == id)
.Select(s => s.ChildAccounts);
返回类型为
的对象IQueryable<ICollection<ChildAccount>>
但是,我需要返回类型:
List<ChildAccount>
我似乎无法使语法正确。我假设在那里会有一个ToList(),但在我试过的每个地方我都得到了一个不同的,不正确的返回类型。
有人可以建议正确的方法吗?
答案 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
以下是重要细节:
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>()
参数为x,y
,表示外部ICollection<ChildAccounts>
的连续元素,并在每次迭代中合并,从而替换种子以供下次执行的数据IQueryable
时进行自定义处理,但在最终结果上,Aggregate会获取第3个参数List
,可用于更改最终集合。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();