与集合中的所有单词匹配的所有项目
问题描述:
我有两个列表:一个Person类型的列表和一个职业类型列表。两者都是多对多的关系。另外,我还有一些专业的名单。 我想选择所有匹配第三个列表中所有职业的人。 什么是LINQ/Lambda表达式?与集合中的所有单词匹配的所有项目
感谢
答
的答案取决于你的Persons
序列是如何连接到您的Professions
序列。
您正在讨论列表,但也涉及多对多关系,所以我假设您的列表实际上是关系数据库中的表格,其中的连接表格会记住哪些人员和职业是相关的。
如果使用实体框架,并已建立了many-to-many relationship正确,您不需要第三个表:
class Person
{
public int Id {get; set;}
... // other properties
// every Person has zero or more Professions (many-to-many)
public virtual ICollection<Profession> Professions {get; set;}
}
class Profession
{
public int Id {get; set;}
... // other properties
// every Profession has zero or more Persons (many-to-many)
public virtual ICollection<Person> Persons {get; set;}
}
class MyDbContext : DbContext
{
public DbSet<Person> Persons {get; set;}
public DbSet<Profession> Professions {get; set;}
}
这就是全部!
实体框架将认识到您建立了多对多关系并为其创建第三个表。您不需要第三张表,只需访问ICollections,实体框架将自动执行第三个表所需的连接。
using (var dbContext = new MyDbContext())
{
IEnumerable<Profession> professionList = ... // the third list
// Keep only the persons where have exactly all Professions from the profession list
// do this by checking the Ids of the professions in the list
IEnumerable<int> professionIds = professions
.Select(profession => profession.Id)
.OrderBy(id => id);
var personsWithProfessions = dbContext.Persons
// keep only persons that have the same Profession Ids as professionIds
// first extract the the profession Ids the person has
.Where(person => person.Professions
.Select(profession => profession.Id)
// order this in ascending order
.OrderBy(id => id)
// check if equal to professionIds:
.SequenceEqual(professionIds))
如果你不使用实体框架,或类不与虚拟ICollection的设置正确,你就必须做Persons
和Professions
自己
之间的连接假设你有一个加入表中加入了您的个人和职业:
class Person_Profession
{
public int Id {get; set;}
public int PersonId {get; set;}
public int ProfessionId {get; set;}
}
IQueryable<Person_Profession> Person_Profession_Table = ...
第一组每个人都与在Person_Profession_Table所有ProfessionIds。
var personsWithProfessionIds = Persons.GroupJoin(person_profession_table,
person => person.Id,
personProfession => personProfession.PersonId,
person, matchingJoiningItems => new
{
Person = person,
ProfessionIds = matchingJoiningItems
.Select(matchingJoiningItem => matchingJoiningItem.ProfessionId)
.OrderBy(id => id)
.ToList(),
})
言外之意:拿两个表:人员和人员职业。从每个人身上取出Id,从每个PersonProfession元素中取PersonId,为每个人和所有匹配的PersonProfessions创建一个新的对象:该对象包含匹配的Person,以及所有ProfessionIds的匹配的joiningItems。
从这些人与他们的ProfessionIds,只保留在第三个列表中的所有ProfessionIds
IEnumerable<int> professionIds = professions
.Select(profession => profession.Id)
.OrderBy(id => id);
IEnumerable<Person> matchingPersons = personsWithProfessionIds
.Where(personWithProfessionId => personWithProfessioinId.ProfessionIds
.SequenceEqual(professiondIds))
.Select(personWithProfessionId => perfonWithProfessionId.Person);
答
假设你的List
S按含成员List
发其他类型的相关的人员,
var AllPersons = new List<Person>();
var AllProfessions = new List<Profession>();
var desiredProfessions = new List<Profession>();
var findPersons = from p in AllPersons
where p.Professions.Any(pp => desiredProfessions.Contains(pp))
select p;
分享您的代码,请 –
请显示您的尝试?它也是一个内存集合或一些数据库。如果后者那么框架? –
您根本没有提供任何细节。你是否试图解决这个问题?你得到了什么结果?请阅读[如何提问](https://*.com/help/how-to-ask)指导并更新您的问题。 – Brett