Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回列表而不是IQueryable_C#_Linq - Fatal编程技术网

C# 返回列表而不是IQueryable

C# 返回列表而不是IQueryable,c#,linq,C#,Linq,我有以下的表达: var a = DBContext.Summaries .Where(fs => fs.PersonID == id) .Select(s => s.ChildAccounts); 它返回类型为的对象: IQueryable<ICollection<ChildAccount>> IQueryable 但是,我需要返回类型为: List<ChildAccount> 列表 我似乎无法正确理解语法。我假设在某个地方会有一

我有以下的表达:

var a = DBContext.Summaries
 .Where(fs => fs.PersonID == id)
 .Select(s => s.ChildAccounts);
它返回类型为的对象:

IQueryable<ICollection<ChildAccount>> 
IQueryable
但是,我需要返回类型为:

List<ChildAccount>
列表
我似乎无法正确理解语法。我假设在某个地方会有一个ToList(),但在我尝试过的每个地方,我都会得到一个不同的、不正确的返回类型


有人能建议正确的方法吗?

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

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

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

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

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

因此,您可以使用id条件获取
摘要
,并选择所需的列

如果需要多列,可以键入

var a=DBContext.Summaries.Where(fs=>fs.PersonID==id)。选择(s=>newsummaries{ ChildAccounts=s.ChildAccounts, .... }).ToList()

复制并粘贴

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

因此,您可以使用id条件获取
摘要
,并选择所需的列

如果需要多列,可以键入

var a=DBContext.Summaries.Where(fs=>fs.PersonID==id)。选择(s=>newsummaries{ ChildAccounts=s.ChildAccounts, .... }).ToList()

以上代码应给出您的
列表
。在这里,
SelectMany
可展平返回列表列表的查询。例如,您可以看到


以上代码应给出您的
列表
。在这里,
SelectMany
可展平返回列表列表的查询。例如,您可以看到。

虽然
SelectMany
的工作是将集合展平,并用
IEnumerable
形成一个
IEnumerable
,但如果您需要细粒度控制,并希望应用自定义逻辑,请按如下所示使用
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;    
                                    });
var a=DBContext.Summaries
.Where(fs=>fs.PersonID==id)
.选择(s=>s.ChildAccounts)
.Aggregate(新列表(),
(x,y)=>
{
x、 AddRange(y);
返回x;
});
以下是重要的细节:

  • new List()
    是最终集合的空种子数据。如果需要,我们甚至可以使用第一个元素作为种子数据,并从第二个元素开始聚合
  • Lambda中的
    x,y
    参数是
    ICollection
    ,表示外部
    IQueryable
    的连续元素,并在每次迭代中合并,从而替换下一次执行的数据种子
  • 您可以在合并
    列表
    时进行自定义处理,但在最终结果上,聚合将使用第三个参数
    Func resultSelector
    ,该参数可用于更改最终集合
  • 因为种子数据是一个
    列表
    ,所以所有中间结果都是
    列表
    ,因为我们返回的是聚合结果

  • 虽然
    SelectMany
    的工作是将集合展平,并在
    IEnumerable
    中形成一个
    IEnumerable
    ,但如果您需要细粒度控制并希望应用自定义逻辑,则使用
    聚合
    ,如下所示:

    var a = DBContext.Summaries
                     .Where(fs => fs.PersonID == id)
                     .Select(s => s.ChildAccounts)
                     .Aggregate(new List<ChildAccounts>(),
                                (x,y) => 
                                        {
                                          x.AddRange(y);
                                          return x;    
                                        });
    
    var a=DBContext.Summaries
    .Where(fs=>fs.PersonID==id)
    .选择(s=>s.ChildAccounts)
    .Aggregate(新列表(),
    (x,y)=>
    {
    x、 AddRange(y);
    返回x;
    });
    
    以下是重要的细节:

  • new List()
    是最终集合的空种子数据。如果需要,我们甚至可以使用第一个元素作为种子数据,并从第二个元素开始聚合
  • Lambda中的
    x,y
    参数是
    ICollection
    ,表示外部
    IQueryable
    的连续元素,并在每次迭代中合并,从而替换下一次执行的数据种子
  • 您可以在合并
    列表
    时进行自定义处理,但在最终结果上,聚合将使用第三个参数
    Func resultSelector
    ,该参数可用于更改最终集合
  • 因为种子数据是一个
    列表
    ,所以所有中间结果都是
    列表
    ,因为我们返回的是聚合结果

  • @谢谢,我就是这么想的needed@jmcilhinney谢谢,这就是我需要的请解释你的代码。为什么它是这样工作的?“复制粘贴”不是很有建设性。OP将只学习复制和粘贴,仅此而已。请解释您的代码。为什么它是这样工作的?“复制粘贴”不是很有建设性。OP将只学习复制和粘贴,仅此而已。您没有尝试将
    .ToList()
    放在末尾吗?是的,我做了,但不起作用。为什么它对您不起作用,但您已将其标记为正确答案?它们应该是关于在某些位置选择多少作品的参考副本。您没有尝试将
    .ToList()放在后面吗
    最后?是的,我做了,但那不起作用。为什么它对你不起作用,而你已经将它标记为正确答案?它们应该是关于在某些地方选择多少作品的参考副本。。