Linq根据另一个列表查询对象列表的结果

时间:2016-07-05 11:44:03

标签: c# 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

如果列表1中存在Id,我想查询第二个列表。意思是我应该得到包含以下内容的列表:

SomeObject[0]  
SomeObject[1]

尝试下面的代码但没有成功:

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

提前致谢。

3 个答案:

答案 0 :(得分:5)

您可以使用Enumerable.Contains

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

如果list1中的值为uniqe,您也可以使用more efficient Join

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 :(得分:1)

您的查询存在的问题是,您尝试在Contains上致电long。相反它应该是list1 .Any(t => t2.Id == t)。但相反,你可以加入。

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

答案 2 :(得分:1)

您还可以使用以下代码段来获得所需的结果,其中

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