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();
它是有效的。但这不是我的要求。我的要求是一个字符串列表,而不是一个字符串。
以下查询将返回名称列表中存在的不同供应商名称:
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));