Я использую MediatR просить A visualizationDtoФильтрация на ProjectToList в LINQ
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
мне нужно отфильтровать стеки, которые уже закончили так что те, которые не имеют таймаут нуль.
Как выглядит код для ProjectTo? Каков ожидаемый результат, и каков результат, который вы фактически получаете? –
ProjectTo - это функция automapper. Он сопоставляет объекты, которые похожи, поэтому уровень и уровеньD имеют одинаковые свойства вместо того, чтобы писать много ненужного кода для сопоставления 1 с другим, это делает его с помощью одной функции. –