C# LINQ包含两个列表

C# LINQ包含两个列表,c#,linq-to-sql,C#,Linq To Sql,我有一个字符串列表和一个供应商列表 字符串列表包含一些搜索项,供应商列表包含供应商对象列表。 现在我需要找到与字符串列表中的任何项目匹配的所有供应商名称 这是我失败的尝试之一 var query = some join with the supplier table. query = query.where(k=>stringlist.contains(k.companyname)).select (...).tolist(); 你知道怎么做吗 编辑: 可能是我的问题不够清楚…我需要找到

我有一个字符串列表和一个供应商
列表

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

这是我失败的尝试之一

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();
它起作用了。但这不是我的要求。
我的要求是一个字符串列表,而不是单个字符串。

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

var matches = yourList.Where(x => stringList.Contains(x.CompanyName)).Select(x => x.CompanyName).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考虑使用更好的名称,例如“代码> CONNYMENS ”而不是<代码> StRistList

< P> >您可以使用这个(仅用于匹配名称):

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


按照Tim的建议使用join,或者直接使用
HashSet
。这比在
列表中使用
.Contains
更有效,就像在其他一些答案中一样

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

找出伪代码的错误所在,您只需要在select中输入文件名,它就可以工作。这与linqtosql有什么关系?如果您能够澄清您想要的内容和/或给我们对象的确切名称,它实际上可以工作。我将进行编辑以显示如何仅选择名称。@kandroid根据您的编辑,我的原始答案正是您想要的。编辑前请检查版本。我的代码是否与您的代码相似。我只是没有那么清楚!!但是在我的代码中,第一个查询返回1000个项目,在查询之后,它什么也不返回。但是,如果我只取一个字符串,就不需要字符串列表。信息技术works@kandroid如果您需要整个供应商对象,甚至
suppliers.Where(s=>stringlist.Contains(s.CompanyName))
都应该完成这项工作。确保你真的有匹配的供应商。也许公司名称没有删减?同样,在第一个查询中,您会检查公司名称是否与值完全匹配。在您的工作样本中,您检查值是否在公司名称中。因此,如果您有值
org
和公司名
Zorg
,那么它将不匹配。但是您的上一个查询将匹配,因此
org
包含在
Zorg
中实际上主要问题是query=query.where(k=>stringlist.contains(k.companyname)).select(…).tolist();在这里它寻找一个精确的匹配…你知道如何使它成为可能,使它像“like”一样工作吗?@kandroid据我所知,Linq到SQL,对于本地序列(stringlist),只有
包含
才能转换成SQL。因此,为了使用like,您应该将过滤移到内存中(例如使用
ToList
):
suppliers.ToList()。其中(s=>stringlist.Any(x=>s.CompanyName.Contains(x))
。此查询将搜索所有名称如stringlist中的某个值的公司。但请记住,将过滤移到内存中会将所有公司加载到memoryBTW实体框架中,可以将本地集合中的
任何
转换为sql查询。
var suppliers = supplierObjects.Where(s => supplierNames.Contains(s.CompanyName));
var stringSet = new HashSet(stringList);
var result = query.Where(q => stringSet.Contains(q.Name));