2016-09-22 7 views
2

Я использую 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 

мне нужно отфильтровать стеки, которые уже закончили так что те, которые не имеют таймаут нуль.

+0

Как выглядит код для ProjectTo? Каков ожидаемый результат, и каков результат, который вы фактически получаете? –

+0

ProjectTo - это функция automapper. Он сопоставляет объекты, которые похожи, поэтому уровень и уровеньD имеют одинаковые свойства вместо того, чтобы писать много ненужного кода для сопоставления 1 с другим, это делает его с помощью одной функции. –

ответ

0

Условие Where выполнено только для сумм, не превышающих lq. Попробуйте stacks.ProjectTo<LevelDto>(), что должно сделать трюк.

+0

Я использую ProjectTo для сопоставления между объектами db и тактами стека stackdto и level to leveldto. поэтому я сопоставил lq и позже добавил отфильтрованные стеки с помощью .Select (l => new {l, stacks}). ToList(). Выберите (x => xl) .ToList(), но я увижу, могу ли я найти способ построить уровень из стеков, хотя –

+0

lq и стеки, кажется, IQuerable. Если вы используете 'Where', вы не применяете это к lq. Он создает новый запрос, а lq такой же, как и раньше. Вы можете попробовать 'lq.Where (l => l.Buffers.Any (b => b.StackLocations.Any (s => s.TimeOut == null))). ProjectTo ()' – Rabban

+0

нет, это первое, что нужно я попытался, фильтр, похоже, не прошел мимо projectTo. и если я потом фильтрую, это уже список, поэтому большие наборы могут быть очень медленными. –