2016-07-05 72 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));