簡體   English   中英

Linq返回父對象,其子項與單獨列表中的所有項匹配

[英]Linq return parent objects that have child items matching ALL items in separate list

我有一個對象,它有一個可變長度的項目列表(代碼示例中的incomingList)和一個人員列表,每個人都有一個項目列表。 我想只返回那些包含incomingList中所有項目的人。

所以看一下這個例子,我只想讓第一和第三人回來。

人們在數據庫中,我想盡可能少地檢索數據,所以我想弄清楚linq查詢需要實現的目標是什么? 如果我知道incomingList的長度總是相同,我可以做“......任何(...)&& ...任何(...)&&”等 - 但長度會有所不同。

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; }
}

這將返回其ListOfItems中包含所有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 }) ));

匿名類型應具有相同名稱和類型的屬性以解析為“相等”,在這種情況下滿足哪個條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM