查找不在DB中的字符串

时间:2012-01-29 20:56:22

标签: performance linq optimization

我的应用程序中存在一些不良的性能问题。其中一项重大操作是比较字符串。 我下载了一个字符串列表,大约1000 - 10000.这些都是唯一的字符串。 然后我需要检查数据库中是否已存在这些字符串。 我正在使用的linq查询如下所示:

IEnumerable<string> allNewStrings = DownloadAllStrings();

var selection = from a in allNewStrings
                where !(from o in context.Items
                        select o.TheUniqueString).Contains(a)
                select a;

我做错了什么或者如何使用Linq更快地完成这个过程?

感谢。

2 个答案:

答案 0 :(得分:1)

您确实为allNewStrings中的每个元素查询了相同的唯一字符串1000 - 10000次,因此效率极低。

尝试分别查询唯一字符串,以便执行一次:

IEnumerable<string> allNewStrings = DownloadAllStrings();

var uniqueStrings = from o in context.Items
                    select o.TheUniqueString;

var selection = from a in allNewStrings
                where !uniqueStrings.Contains(a)
                select a;

现在您可以看到最后一个查询可以使用Except编写,这对于像您的示例这样的集合运算符更有效:

var selection = allNewStrings.Except(uniqueStrings);

答案 1 :(得分:1)

另一种解决方案是使用HashSet

var set = new HashSet<string>(DownloadAllStrings());
set.ExceptWith(context.Items.Select(s => s.TheUniqueString));

set现在将包含不在数据库中的字符串。