LINQ包含2个列表

时间:2013-08-23 13:24:50

标签: c# linq-to-sql

我有一个字符串列表和供应商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();

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

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

var suppliers = supplierObjects.Where(s => supplierNames.Contains(s.CompanyName));

答案 2 :(得分:0)

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

答案 3 :(得分:0)

可以使用Tim建议的联接,也可以直接使用HashSet。在.Contains上使用List和其他一些答案一样,效率要高得多。

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