2017-10-20 107 views
-2

我有两个列表:一个Person类型的列表和一个职业类型列表。两者都是多对多的关系。另外,我还有一些专业的名单。 我想选择所有匹配第三个列表中所有职业的人。 什么是LINQ/Lambda表达式?与集合中的所有单词匹配的所有项目

感谢

+0

分享您的代码,请 –

+0

请显示您的尝试?它也是一个内存集合或一些数据库。如果后者那么框架? –

+1

您根本没有提供任何细节。你是否试图解决这个问题?你得到了什么结果?请阅读[如何提问](https://stackoverflow.com/help/how-to-ask)指导并更新您的问题。 – Brett

回答

0

的答案取决于你的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的设置正确,你就必须做PersonsProfessions自己

之间的连接假设你有一个加入表中加入了您的个人和职业:

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); 
0

假设你的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; 
相关问题