簡體   English   中英

在LINQ to Entities中檢查重復項的最快方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM