LINQ中字符串字段的IN sql运算符的替代方法是啥?

Posted

技术标签:

【中文标题】LINQ中字符串字段的IN sql运算符的替代方法是啥?【英文标题】:What is the alternative for IN sql operator in LINQ for string field?LINQ中字符串字段的IN sql运算符的替代方法是什么? 【发布时间】:2021-10-16 22:10:53 【问题描述】:

请在下面找到我想要实现的示例。

List<string> list = new List<string>()  "Test", "Test1", "Test2","Test","Test1" ;

SQL = select * from table_name
     where column_name IN ("Test","Test1");<br/>
output =  "Test","Test1","Test","Test1"

LINQ= from x in list where list.Contains("Test","Test1") select x

output =  "Test", "Test1", "Test2","Test","Test1" 

包含不完全匹配。 我们如何在 LINQ 中使用字符串列表获得与 SQL IN 运算符相同的输出?

谢谢

【问题讨论】:

你可以使用ContainsAny 它应该会给你类似的结果。 LINQ 语句不是您想要的。 where list.Contains("Test","Test1") 总是正确的。 【参考方案1】:

您使用 Contains 不正确(实际上,您的示例代码无法编译)。相反,声明一个您希望匹配的集合并在该集合上使用 Contains,如下所示:

List<string> list = new List<string>()  "Test", "Test1", "Test2","Test","Test1" ;

var match = new HashSet<string>()  "Test", "Test1" ;

var result = from x in list where match.Contains(x) select x;

结果:

Test
Test1
Test
Test1

【讨论】:

请注意,您可以创建 match 内联(不是很简洁地认为是 HashSet)而不会影响性能(在这个小例子中):new[] "Test", "Test1" .Contains(x) 是的,我确实经常这样做。我认为单独的声明会更容易理解。 我同意它更容易理解,但可能不像 SQL。【参考方案2】:

与 Eric 的答案类似但使用连接的方法:

var list = new List<string>()  "Test", "Test1", "Test2","Test","Test1" ;
var match = new HashSet<string>()  "Test", "Test1" ;

var results = from x in list
              join y in match on x equals y
              select x;

【讨论】:

以上是关于LINQ中字符串字段的IN sql运算符的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linq 的 Where 条件中使用 IN 运算符

SQL --------------- 运算符 = 与 in

列车数据库中的 linq 查询

在 LINQ 中进行字符串比较的问题

C# Linq to sql 实现 group by 统计多字段 返回多字段

如何在linq中选择All(*)到sql