我有一个表在SQL Azure表中存储字符串。用户可以从Web浏览器上传新字符串的文件,我正在检查基于Entity Framework上下文的重复项。我将重复数据删除字符串添加到上下文的代码如下所示:
using (StreamReader sr = new StreamReader(theStream))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (!context.MyEntity.Any(o => o.String == line))
{
theString = new DAL.TheString();
theString .String = line;
context.MyEntity.Add(theString );
totalAdded++;
}
}
}
使用MyEntity.Any()方式太慢了。处理20,000个字符串需要40分钟,一些简单的编排似乎指向重复检查。
我的问题是:在EF中最快的方法是什么? L2E不是这里工作的最佳工具吗?我应该完全摆脱EF吗?或者我应该排队文件并设置后台工作人员,因为这总是很慢。
答案 0 :(得分:1)
假设您的数据库表不是很大,以至于字符串不能全部适合内存,您可以通过一个查询将它们放入HashSet
,然后查询该内存中的集合:
var lines = new HashSet<string>(context.MyEntity.Select(o => o.Property));
using (StreamReader sr = new StreamReader(theStream))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (lines.Add(line))
{
//add line
}
}
}
如果你没有足够的内存来实现这一点,那么你最好的选择可能是在数据库中创建一个新的触发器来验证该属性是唯一的,并且会抛出试图创建重复的记录。然后,您可以尝试添加流中的所有行,并让数据库在获取所有行时对其进行排序。