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.
我认为 LINQ
到 Entities
的问题可能无法理解如何转换 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);
我正在使用 .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.
我认为 LINQ
到 Entities
的问题可能无法理解如何转换 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);