2016-07-05 78 views
3

我有號碼的列表上對象名單,結果如下圖所示:的LINQ查詢基於另一個列表

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

而且我有對象的列表,其中一個屬性就是長:

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 

我想查詢第二個列表,如果它有Id的列表1中存在。這意味着我應該得到包含列表:

SomeObject[0] 
SomeObject[1] 

嘗試下面沒有成功的代碼:提前

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

感謝。

回答

5

您可以使用Enumerable.Contains

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

如果在列表1的值潮頭您還可以使用more efficientJoin

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

你的方法行不通:

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

因爲t2.Id返回一個long其中沒有Contains方法。

如果你想使用Any,你可以這樣做:

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

也許你也可以解釋爲什麼OP的做法沒有奏效。畢竟,他確實使用過「Contain」。 – Lumen

+1

@TimSchmelter't'也是一個'long',但他不會爲't'檢查'Id'。他檢查'Id'是否爲't2',即'SomeObject'具有'Id'。 –

1

與您的查詢的問題是,您要撥打Containslong。相反,它應該是list1 .Any(t => t2.Id == t)。但是,你可以做一個加入。

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

@ Tim-Thanks,Tim –

+0

@ juharr-謝謝 –

1

您還可以使用下面的代碼片段,以獲得期望的結果,其中

var result = list2.Where(l2 => list1.Any(l1 => l1 == l2.Id)); 
相關問題