2016-06-09 2 views
5

У меня есть объект с переменным размером списка элементов (entryList в примере кода) и список людей, у каждого из которых есть список элементов. Я хочу вернуть только тех людей, у которых есть все элементы входящего списка.Linq возвращает родительские объекты, у которых есть дочерние элементы, соответствующие всем элементам в отдельном списке

Так что, глядя на пример, я хочу, чтобы только 1 и 3 человека вернулись.

Люди находятся в базе данных, и я хочу получить как можно меньше данных, поэтому я пытаюсь выяснить, что должен сделать запрос linq для этого? Если бы я знал, что длина входящего списка всегда будет такой же, как я мог бы сделать »... Любые (..) & & ... Любые (...) & &" и т. Д. - но длина будет отличаться.

void Main() 
{ 
    var incomingList = new IncomingItem(); 

    var matchItem1 = new MatchItem { ItemType = "objectId", ItemValue = "60" }; 
    var matchItem2 = new MatchItem { ItemType = "area", ItemValue = "CU" }; 

    incomingList.MatchList = new List<MatchItem>(); 
    incomingList.MatchList.Add(matchItem1); 
    incomingList.MatchList.Add(matchItem2); 

    var people = new List<Person>(); 

    var person1 = new Person { Id = 1 }; 
    person1.ListOfItems = new List<Item>(); 
    person1.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "60" }); 
    person1.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "1" }); 
    person1.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "30" }); 
    person1.ListOfItems.Add(new Item { ItemType = "area", ItemValue = "CO" }); 
    person1.ListOfItems.Add(new Item { ItemType = "area", ItemValue = "CU" }); 
    people.Add(person1); 

    var person2 = new Person { Id = 2 }; 
    person2.ListOfItems = new List<Item>(); 
    person2.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "60" }); 
    people.Add(person2); 

    var person3 = new Person { Id = 3 }; 
    person3.ListOfItems = new List<Item>(); 
    person3.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "60" }); 
    person3.ListOfItems.Add(new Item { ItemType = "area", ItemValue = "CU" }); 
    people.Add(person3); 

    var person4 = new Person { Id = 4 }; 
    person4.ListOfItems = new List<Item>(); 
    person4.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "12" }); 
    people.Add(person4); 
} 

public class IncomingItem 
{ 
    public IList<MatchItem> MatchList { get; set; } 
} 

public class MatchItem 
{ 
    public List<object> SomeMoreInformation { get; set; } 

    public string ItemType { get; set; } 

    public string ItemValue { get; set; } 
} 

public class Person 
{ 
    public int Id { get; set; } 

    public IList<Item> ListOfItems { get; set; } 
} 

public class Item 
{ 
    public int Id { get; set; } 

    public int PersonId { get; set; } 

    public string ItemType { get; set; } 

    public string ItemValue { get; set; } 
} 

ответ

2

Это возвращает все люди, у которых есть все элементы incomingList в их ListOfItems:

var result = people.Where(p => incomingList.MatchList 
         .All(l => p.ListOfItems.Select(loi => new { loi.ItemType, loi.ItemValue }) 
          .Contains(new { l.ItemType, l.ItemValue }))); 

Анонимные типы должны иметь свойства с одинаковыми именами и типами для разрешения на «равных», что условие выполнено Это дело.

+0

Спасибо, это работает, но я не могу понять, почему это происходит, когда он не ссылается на оба свойства, что мне не хватает? – crockels

+0

Нет, он должен соответствовать как ItemValue, так и ItemType, а не только ItemValue. (Что, по-вашему, делает ваше решение, но я не вижу, как это делается!) – crockels

+0

Хотя это работает на примере, он не работает при перемещении в мой основной код. Я получаю ошибку EF: Невозможно создать постоянное значение типа «DTO.MatchListIten». В этом контексте поддерживаются только примитивные типы или типы перечислений. DTO.MatchListItem не является объектом базы данных, Person и Item. – crockels

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