2017-10-20 155 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; 
相關問題