2016-03-16 3 views
0

Я пытаюсь использовать содержится в списке в списке, но застрял на этом один:LINQ содержится в списке в списке

var postFilter = PredicateBuilder.False<Company>(); 

// Loop through each word and see if it's in the company's facility 
foreach (var term in splitSearch) 
{ 
    var sTerm = term.Trim(); 
    postFilter = postFilter.Or(x => 
     x.Facilities.Contains(y=> 
      y.Facility.Name.ToUpper().Contains(sTerm)) || 
     x => x.Facilities.Contains(y => 
      y.Facility.Description.ToUpper().Contains(sTerm))); 
} 

Постфильтры список компаний, компания имеет список элементов companyfacility, которые являются отношениями 1: m. У объекта также есть связь 1: m с этой таблицей. Таким образом, x представляет объект companyfacility. Объект y должен представлять объект объекта.

(Таким образом, у компании может быть много объектов, и объект может принадлежать многим компаниям. Между тем я использую таблицу companyfacility для дополнительной информации об этом предприятии. Например, конкретная компания может иметь таблицу токарного станка, которая идет на диаметр 300, где другие компании достигнут диаметра 250, поэтому важно иметь таблицу между ними)

Я хочу вернуть компании, у которых есть sTerm в описании объекта или объекта, но этот оператор linq недействителен.

Спасибо за помощь!

+0

Я хотел бы избежать использования идентификаторов типа 'x' и' y' в вложенных лямбдах. Вы можете легко использовать 'company' и' facility' как идентификаторы. –

+0

Да, вы правы, спасибо за указатель! – Curator

ответ

1

Вот LINQ и пример код:

void Main() 
{ 
    List<Company> postFilter = new List<UserQuery.Company>(); 

    var sTerm = "XXX".Trim().ToUpper(); 
    postFilter = postFilter.Where(x => 
           x.Facilities.Any(f => f.Name.ToUpper().Contains(sTerm) 
                || f.Description.ToUpper().Contains(sTerm))).ToList(); 
} 

public class Company 
{ 
    public string CompanyName { get; set; } 
    public List<Facility> Facilities { get; set; } 

} 

public class Facility 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 
+0

, используя ваш вход, я нашел свое решение, спасибо большое! postFilter = postFilter.Or (x => x.Facilities.Any (y => y.Facility.Name.ToUpper(). Содержит (sTerm)) || x.Facilities.Any (y => y.Facility . .Description.ToUpper() Содержит (sTerm))); – Curator

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