2016-07-05 19 views
3

ich eine Liste von Zahlen haben, wie unten dargestellt:Linq Ergebnisse der Liste der Objekte zur Abfrage basierend auf einer anderen Liste

1) List<long> list1 : 101, 102, 103 

Und ich habe eine Liste von Gegenständen, in denen eine Eigenschaft lang ist:

2) List<SomeObject> list2: 
    SomeObject[0]- (long)Id : 101, 
        Name: Adam, 
        Address:xxx 
    SomeObject[1]- (long)Id : 102, 
        Name: Bran, 
        Address:xxx 
    SomeObject[2]- (long)Id : 109, 
        Name: Queen, 
        Address:yyy 

Ich möchte die zweite Liste abfragen, wenn es Ids in list1 vorhanden ist. enthält Bedeutung Ich sollte Liste erhalten:

SomeObject[0] 
SomeObject[1] 

den Code Versuchte unten ohne Erfolg:

(from t2 in list2 
      where list1 .Any(t => t2.Id.Contains(t)) == true 
      select t2); 

Vielen Dank im Voraus.

Antwort

5

können Sie Enumerable.Contains verwenden:

var query = from t2 in list2 
      where list1.Contains(t2.Id) 
      select t2; 

, wenn die Werte in list1 uniqe sind, können Sie auch die more efficientJoin verwenden:

var query = from t2 in list2 
      join t1 in list1 
      on t2.Id equals t1 
      select t2; 

Ihr Ansatz nicht funktioniert:

where list1.Any(t => t2.Id.Contains(t)) == true 

weil t2.Id eine 012 zurückgibt, die keine Contains Methode hat.

Wenn Sie verwenden wollte Any könnten Sie verwenden:

where list1.Any(t => t2.Id == t) 
+1

Vielleicht können Sie auch erklären, warum das Konzept der OP nicht funktionierte. Er hat immerhin "Contain" benutzt. – Lumen

+1

@TimSchmelter 't' ist auch ein' long', aber er prüft 'Id' nicht für' t'. Er überprüft "Id" für "t2", das ist "SomeObject", das "Id" hat. –

1

Das Problem mit Ihrer Anfrage ist, dass Sie Contains auf einem long anrufen möchten. Stattdessen sollte es list1 .Any(t => t2.Id == t) sein. Aber stattdessen können Sie einfach einen Beitritt machen.

from t1 in list1 
join t2 in list2 on t1 equals t2.Id 
select t2 
+0

@ Tim-Danke, Tim –

+0

@ juharr- Danke –

1

Sie können auch den folgenden Code-Schnipsel verwenden Sie das gewünschte Ergebnis zu erhalten, wo

var result = list2.Where(l2 => list1.Any(l1 => l1 == l2.Id)); 
Verwandte Themen