在LINQ中筛选项目列表

本文关键字:项目 列表 筛选 LINQ | 更新日期: 2023-09-27 18:08:31

我正在使用MediatR请求一个visualizationDto

public VisualizationResponse Handle(VisualizationQuery message)
{
    return new VisualizationResponse
    {
        LoadTick = DateTime.Now.Ticks,
        Visualization = new VisualizationDto
        {
            infeed = context.Unloaders.ProjectToList<InfeedDto>(),
            Levels = context.Levels.ProjectToList<LevelDto>()
        }
    };
}

这些直接从一个DbContext映射而来。现在的问题是ProjectToList<>递归映射。在这一层中有一个缓冲区列表,在每个缓冲区中有一个堆栈列表。现在我只需要映射TimeOut值为null的堆栈。我不想在映射后过滤所有内容,因为这可能会减慢速度。我试过了

var lq = context.Levels;
var stacks = lq
    .SelectMany(l => l.Buffers)
    .SelectMany(b => b.StackLocations)
    .Where(s => s.TimeOut == null);
Levels = lq.ProjectTo<LevelDto>().Select(l => new {l, stacks}).ToList().Select(x => x.l).ToList()

但是我收到的值不是过滤后的值,仍然是完整的数据集。还有其他方法对ProjectToList进行过滤吗?

现在我的输出看起来像

List<LevelDto>
-List<BufferDto>
  -List<StackLocationDto>
    -stack timeIn- TimeOut
    -stack timeIn- TimeOut
    -stack timeIn- null
    -stack timeIn- null

我需要过滤掉已经完成的堆栈,以便那些没有TimeOut为null的堆栈。

在LINQ中筛选项目列表

Where条件只对栈执行,对lq不执行。试试stacks.ProjectTo<LevelDto>(),应该可以。