我有兩個列表:一個Person類型的列表和一個職業類型列表。兩者都是多對多的關係。另外,我還有一些專業的名單。 我想選擇所有匹配第三個列表中所有職業的人。 什麼是LINQ/Lambda表達式?與集合中的所有單詞匹配的所有項目
感謝
我有兩個列表:一個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://stackoverflow.com/help/how-to-ask)指導並更新您的問題。 – Brett