gpt4 book ai didi

c# - Linq 返回具有与单独列表中的所有项目匹配的子项目的父对象

转载 作者:太空狗 更新时间:2023-10-29 23:37:15 25 4
gpt4 key购买 nike

我有一个对象,它有一个可变长度的项目列表(代码示例中的 incomingList)和一个人列表,每个人都有一个项目列表。我只想返回那些拥有 incomingList 中所有项目的人。

所以看这个例子,我只想返回第 1 个人和第 3 个人。

人们在数据库中,我想检索尽可能少的数据,所以我想弄清楚 linq 查询需要什么才能实现这一点?如果我知道 incomingList 的长度总是相同的,我可以执行“...Any(..) && ...Any(...) &&”等 - 但长度会有所不同。

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 项目的所有人:

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

匿名类型应该具有相同名称和类型的属性以解析为“相等”,在这种情况下满足该条件。

关于c# - Linq 返回具有与单独列表中的所有项目匹配的子项目的父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37726814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com