C# linq return 列表的每第 n 行

C# linq return every n-th row of a list

我正在使用 .NET 6,我有一个 class 'projectStatistics' 其中包含给定日期的项目统计信息。

public class ProjectStatistics {
   public int ProjectStatisticsId {get; set;}
   public Project Project {get; set}
   public DateTime Date {get; set}
   public int statistic1 {get; set}
   public int statistic3 {get; set}
   ...
   ...
}

由于查询此结果是资源密集型的,因此每 24 小时在后台执行一次。然后将结果存储在数据库中,然后可以用来创建图表。

现在我遇到的问题是,当数据库中有 1000 行时,我不想用所有这些记录制作图表,假设我想制作一个包含 50 个日期的图表(数据库中的记录)

然后我想return table 行%20 == 0 中的所有行,问题是我不能使用rowId 来检查行%x == 0。因为 table 包含多个项目的统计信息。

我在堆栈溢出时发现了这个问题:

我有这个 LINQ 语句:

var result = projectStatistics
   .Where(s => s.Project == project) // Note: project is a repo method parameter
   .Select( (value, index) => new
   {
     value, 
     index
   })
   .GroupBy(item => item.index % 20, item => item.value) // Note: 20 is a repo method parameter.
   .Select(chunk => chunk.FirstOrDefault()).AsEnumerable();

只有这个查询给我以下错误:

The LINQ expression 'DbSet<ProjectStatistics>()
    .Where(s => s.Project == __project_0)
    .Select((value, index) => new { 
        value = value, 
        index = index
     })' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

我认为 LINQEntities 的问题可能无法理解如何转换 Select 重载(您正在使用)

从MSDN可以看出Supported and Unsupported LINQ Methods (LINQ to Entities)

Select Not supported : IQueryable Select<TSource, TResult>( this IQueryable source, Expression<Func<TSource, int, TResult>> selector )

我们可以在使用 Select 重载之前使用 AsEnumerable()

根据你的逻辑,我做了一些修改,尽量让代码简单

var result = projectStatistics
   .Where(s => s.Project == project)
   .AsEnumerable()
   .Select( (value, index) => new
   {
     value, 
     grp = index % 20
   })
   .Where(s => s.grp == 0);