[英]What is the fastest way to check for duplicates in LINQ to Entities?
我有一個表,該表在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嗎? 還是我應該將文件排隊並設置后台工作人員,因為這總是很慢。
假設數據庫表不是很大,以至於字符串無法全部放入內存中,則可以通過一個查詢將它們放入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
}
}
}
如果您沒有足夠的內存來工作,那么最好的選擇是在數據庫中創建一個新觸發器,以驗證該屬性是唯一的,並且將拋出試圖創建重復項的記錄。 然后,您可以嘗試從流中添加所有行,並讓DB整理出所有行后保留哪些行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.