2013-11-06 3 views
0

Это будет быстро и грязно, но должно дать вам эту идею. Я делал это раньше, но не могу найти, где я это сделал, и не могу вспомнить, так как это было так долго. Мне нужно искать на нескольких уровнях списков ....Поиск по нескольким спискам на нескольких уровнях с помощью linq

Пример: Seach для «свинья»

var query = context.Farms.OrderBy(x => x.FarmName).Select(f => new FarmItem 
{ 
    FarmId = f.FarmId, 
    FarmName = f.FarmName,      
    Fields = f.Fields.OrderBy(x => x.FieldName).Select(d => new FieldItem 
    { 
     FieldId = d.FieldId, 
     FieldName = d.FieldName, 
     Animals = d.Animals.OrderBy(x => x.AnimalName).Select(a => new AnimalItem 
     { 
      AnimalId = a.AnimalId, 
      AnimalName = a.AnimalName 
     }) 
    }) 
}); 

мне нужно, чтобы увидеть, если «свинья» в FarmName, FieldName или AnimalName и

  1. возвращение ферма, если «свинья» находится в имени, и все его поле, и это животные месторождения
  2. возвращения поле с «свиньей» в названии, это так же, как это ферма, и все это месторождение животные
  3. возвращения планы с «свиньей» в названии, это так же, как это поле, и это ферма Филд

ответ

0

Это должно работать (непроверенное):

var query = context.Farms.OrderBy(x => x.FarmName).Select(f => new FarmItem 
{ 
    FarmId = f.FarmId, 
    FarmName = f.FarmName,      
    Fields = f.Fields.OrderBy(x => x.FieldName).Select(d => new FieldItem 
    { 
     FieldId = d.FieldId, 
     FieldName = d.FieldName, 
     Animals = d.Animals.OrderBy(x => x.AnimalName).Select(a => new AnimalItem 
     { 
      AnimalId = a.AnimalId, 
      AnimalName = a.AnimalName 
     }).Where(a => a.AnimalName.Contains("pig")) 
    }).Where(d => d.FieldName.Contains("pig") || d.Animals.Any()) 
}).Where(d => f.FarmName.Contains("pig") || f.Fields.Any()); 
+0

Это не был бы вырезать все животное, если no FieldName.Contains («pig») и поля, если ферма не содержала «свиньи» .. так далее. – user2962189

+0

Действительно, мне нужно будет посмотреть, есть ли в фермах, а затем посмотреть, есть ли в полях, а затем посмотреть, есть ли у животных. Если не спрятать ферму. – user2962189

+0

Нет. Вот почему предложение Where после выбора. Вам может понадобиться вызов .ToEnumerable() между ними. Поле включается, если оно содержит «свиньи», или если в последовательности, присвоенной свойству «Животные», есть какие-либо элементы. Это было бы только в том случае, если один или несколько животных в этом поле имеют «свиньи» от своего имени. Та же логика работает для ферм. –

Смежные вопросы