LINQ包含两个列表

本文关键字:列表 包含两 LINQ | 更新日期: 2023-09-27 18:28:50

我有一个字符串List和一个供应商List<supplier>

字符串列表包含一些搜索到的项目,供应商列表包含供应商对象的列表。现在,我需要找到与字符串List<string>中的任何项目匹配的所有供应商名称。

这是我失败的一次尝试。。

var query = some join with the supplier table.
query = query.where(k=>stringlist.contains(k.companyname)).select (...).tolist();

知道怎么做吗??

编辑:

可能是我的问题不够清楚。。。我需要找到一个供应商列表(不仅是名称,还有整个对象),其中供应商名称和字符串列表中的任何项目都匹配。

如果我做

query = query.where(k=>k.companyname.contains("any_string")).select (...).tolist();

它是有效的。但这不是我的要求。我的要求是一个字符串列表,而不是一个字符串。

LINQ包含两个列表

以下查询将返回名称列表中存在的不同供应商名称:

suppliers.Where(s => stringlist.Contains(s.CompanyName))
         .Select(s => s.CompanyName) // remove if you need whole supplier object
         .Distinct();

生成的SQL查询看起来像:

SELECT DISTINCT [t0].[FCompanyName]
FROM [dbo].[Supplier] AS [t0]
WHERE [t0].[CompanyName] IN (@p0, @p1, @p2)

BTW考虑使用更好的名称,例如companyNames而不是stringlist

您可以使用Intersect(仅用于匹配名称):

var suppliersInBothLists = supplierNames
               .Intersect(supplierObjects.Select(s => s.CompanyName));

编辑之后,对于供应商(不仅仅是名称):

var suppliers = supplierObjects.Where(s => supplierNames.Contains(s.CompanyName));
var matches = yourList.Where(x => stringList.Contains(x.CompanyName)).Select(x => x.CompanyName).ToList();

按照Tim的建议使用联接,或者直接使用HashSet。这比在List上使用.Contains要高效得多,就像在其他一些答案中一样。

var stringSet = new HashSet(stringList);
var result = query.Where(q => stringSet.Contains(q.Name));