2017-03-28 3 views
1

Es gibt eine User Einheit und ich habe eine Liste von User Objekte. User Einheit sieht wie folgt aus:Unterschiedliche Version von Intersect() in LINQ

public class User{ 

public int Id {get; set;} 

public List<Group> Groups {get; set;} 

} 

und Gruppen Klasse sieht wie folgt aus:

public class Group{ 

public int Id {get; set;} 

public string GroupName {get; set;} 

} 

Endlich habe ich eine Liste der Zeichenfolge, die wie folgt lautet:

List<string> GroupNames; 

habe ich eine Liste von User Objekte. Ich möchte Benutzerobjekte auswählen, deren Gruppen ein Gruppenobjekt enthalten, das seinen Namen in der Liste GroupNames hat. Wenn beispielsweise GroupNames NYC, Chicago, Seattle enthalten, möchte ich Benutzer auswählen, deren Gruppenname einer dieser Städte entspricht. In Code Es sieht so aus:

List<string> GroupNames = new List<string> { "NYC", "Chicago","Seattle"}; 

var filteredUsers = Users.Where(x => x.Groups....)// I don't know what to write in this query. 

Können Sie mir helfen, diese Abfrage zu schreiben? Ich schätze jede Hilfe, danke.

Antwort

2

Linq sollten diese leicht slove von Any() mit Contains()

var filteredUsers = Users.Where(x => x.Groups.Any(y => GroupNames.Contains(y.GroupName))); 
+0

In der Tat, diese Abfrage mir einen Fehler gibt. Vielen Dank. – jason

+0

Kann diese Abfrage in einer Async-Methode verwendet werden? – jason

+1

@jason ja sicher kann es – fubo

1

Kombinieren Sie können es tun, indem Any() mit und Contains():

var filteredUsers = Users.Where(t => t.Groups.Any(q => GroupNames.Contains(q.GroupName)); 

Diese zu fubo Antwort fast identisch ist.

Hoffe es hilft!

1

Eine andere Möglichkeit ist mit dem Intersect() + Any() (aber beachten Sie die Verwendung von .Select(x => x.GroupName) wählen nur die GroupName)

var filteredUsers = Users.Where(x => x.Groups.Select(x => x.GroupName).Intersect(GroupNames).Any());