尝试使用 linq 聚合函数

Posted

技术标签:

【中文标题】尝试使用 linq 聚合函数【英文标题】:trying to use linq aggregate function 【发布时间】:2021-03-18 00:37:03 【问题描述】:

我有以下查询,我在哪里使用带有 select 的 where 子句并获取结果(librarySourceRowInputs 的列表),并且想使用聚合而不是(where 和 select)。

在这个过程中,我试图访问聚合中的相同变量,但没有得到任何引用,下面是相同的代码

public static LibrarySourceTableInput CreateLibrarySourceTableInput<T>(List<T> libraries, string mechanicalLibraryName)
       where T : ISourceOfData => new LibrarySourceTableInput()
             
    LibrarySourceRowInputs = libraries?
                             .Where(l => l != null)
                             .Select(l => new LibrarySourceRowInput()
                             
                                 LibrarySourceId = l.Id,
                                 SourceOfDataId = l.SourceOfData.Id
                             ).ToList() ?? new(),
    MappedLibrarySource = mechanicalLibraryName
;

下面是我尝试使用聚合的函数

// trying to replace the where and select in above with aggregate
 var LibrarySourceRowInputs = libraries.Aggregate(new List<LibrarySourceRowInput>(), 
 (prev, next) => 
        // here I am not getting any reference for Id
        );

我不确定这是实现此目的或任何其他方式的正确方法。任何人都可以就此提出任何想法,非常感谢!

【问题讨论】:

【参考方案1】:

我通过使用如下聚合来解决此问题

 LibrarySourceRowInputs = libraries?.Aggregate(new List<LibrarySourceRowInput>(), 
 (acc, ids) =>
 
     if (ids != null)
     
         acc.Add(new LibrarySourceRowInput()  LibrarySourceId = ids.Id, 
                                               SourceOfDataId = ids.SourceOfData.Id );
     
     return acc;
 )

【讨论】:

哪个更快?在哪里选择或聚合? 如果您实际上并未进行聚合,并且只想对每个项目执行操作以获取其副作用,则不应使用 Aggregate。对序列中的每个项目执行操作的正确方法是使用foreach

以上是关于尝试使用 linq 聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

我如何在这里使用 LINQ 聚合? [复制]

LINQ 按时间段聚合和分组

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

使用 GET 请求调用聚合函数

使用 group by 或聚合函数删除变量

Postgresql - 窗口函数聚合