C# 从表列中查找列表中的每个字符串
我有一张大约有一百万行的桌子。其中一列是字符串,我们称之为列a 现在我需要处理一个大约1000个字符串的列表L,主要是一个或两个单词,我需要找到表中的所有记录,其中列a包含列表L中1000个字符串中的一个 我能想到的唯一方法是使用L中的每个字符串进行全表扫描,查找该字符串是否是每行内容a列的子字符串。但这将是O(n2),对于一百万行,这将需要很长的时间C# 从表列中查找列表中的每个字符串,c#,sql,C#,Sql,我有一张大约有一百万行的桌子。其中一列是字符串,我们称之为列a 现在我需要处理一个大约1000个字符串的列表L,主要是一个或两个单词,我需要找到表中的所有记录,其中列a包含列表L中1000个字符串中的一个 我能想到的唯一方法是使用L中的每个字符串进行全表扫描,查找该字符串是否是每行内容a列的子字符串。但这将是O(n2),对于一百万行,这将需要很长的时间 有更好的办法吗?无论是在SQL还是在C#code?我建议研究一下,它不会减少您必须执行的操作的数量,但会提高性能。假设您使用SQL server
有更好的办法吗?无论是在SQL还是在C#code?我建议研究一下,它不会减少您必须执行的操作的数量,但会提高性能。假设您使用SQL server(您应该始终使用相关标记来指定rdbms),
您可以从
列表中创建数据表
,并将其作为存储过程发送给存储过程
在存储过程中,您可以使用该表值参数与数据库_table.col(table_parameter.value)(使用)上的表的简单联接。
当然,如果你像评论中所建议的那样创建一个新的行,事情会进展得快得多。现在一百万行是一个相对较小的数字。您应该能够将A列中的所有字符串连同表的主键一起拉入内存,并使用由1000个字符串组成的很长正则表达式执行正则表达式搜索:
var regex = new Regex("string one|string two|string three|...|string one thousand");
由于正则表达式被编译成最终的自动机,所以字符串的扫描时间会相当快。过滤完成后,收集ID,并使用它们从表中查询整行。最好的方法是使用linq。假设你有你的清单
List<string> test = new List<string>{"aaa","ddd","ddsc"};
包含列A的表在数据库中,列表L在您的C#程序中,我想?听起来您需要A。请告诉我您是否需要对此进行更多解释。我更熟悉此选项,因此我选择此作为问题的答案。但我相信其他的选择也很好。谢谢各位。
var match = YourTable.Where (t=> test.Contains(t.YourFieldName);