2013-06-27 4 views
0

Я пытаюсь отфильтровать список в списке из объекта сущности.Может ли этот код быть преобразован в один оператор linq?

Мне удалось получить код, однако, я не уверен, что это самый чистый способ достижения цели.

Вот код, который я до сих пор:

 foreach (var n1 in tier.MatchNodes) 
     { 
      n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList(); 
     } 

Эффективно MatchNodes содержит коллекцию LenderMatchNodes, однако я хочу вернуть только те узлы, где комиссия == 0.

Спасибо заранее.

+1

LINQ предполагается быть без мутаций, поэтому не с LINQ. Этот код IMHO * чрезвычайно * чистый, потому что сразу видно, что здесь происходит. Я оставлю это. Однако стоит обратить внимание на интеграцию фильтрации ранее в вашей обработке. – Jon

+0

Я не рассматриваю _filtering_ список связанных объектов как мутацию ... –

+1

@DStanley: код мутирует 'MatchNodes'. – Jon

ответ

0

Попробуйте

tier.MatchNodes.ToList().ForEach(n1=>n1.LenderMatchNodes = n1.LenderMatchNodes.Where(x => x.Commission == 0).ToList()); 
+0

Ну, Techincally это одна строка, но я хочу, чтобы _intent_ должен избегать зонда n + 1 (не загружать связанные объекты по одному) –

0

Попробуйте использовать SelectMany():

var result = dataContext.Table<Tier>() 
    .Where(some condition to get you the tier) 
    .SelectMany(tier => tier.MatchNodes) 
    .SelectMany(node => node.LenderMatchNodes) 
    .Where(x => x.Commission == 0) 
    .ToList(); 

Это имеет дополнительное преимущество, заключающееся в состоянии выполнить это один запрос SQL.

Если вы цель состоит в том, чтобы фактически обновить список узлов в базе данных, вы можете свести к минимуму количество запросов с использованием Include() (при условии, что вы используете EF):

var nodes = dataContext.Table<Tier>() 
     .Where(some condition to get you the tier) 
     .SelectMany(tier => tier.MatchNodes) 
     .Include(node => node.LenderMatchNodes) // loads this eagerly 
     .ToList(); 
nodes.ForEach(n => n.LenderMatchNodes = n.LenderMatchNodes.Where(condition));