2008-12-21 123 views
2

我想知道是否有一種更簡單的方法來批量插入一組記錄,如果它們不存在於表中。例如,我在數據庫中有一個標籤表,它具有ID,名稱列 - 給定一個標籤名稱列表,我只想添加那些不存在的標籤名稱。這是我想出的:在通過Linq插入到SQL之前檢查是否存在

private static void InsertTags(IEnumerable<string> tagNames) 
{ 
    MyDataContext db = new MyDataContext(); 

    var tags = from tagName in tagNames 
    where (db.Tags.Where(tag => tagName == tag.Name).FirstOrDefault() == null) 
    select new Tag 
    { 
     Name = tagName 
    }; 
    db.Tags.InsertAllOnSubmit(tags); 
} 

有沒有更好的方法?

回答

1

我不確定,但我實際上認爲這是最優的。我認爲改進性能的唯一方法是提高性能(如果至關重要),那就是使用SP,通過linq to sql可以訪問SP。

請記住,InsertAllOnSubmit命令不會執行批量更新,只是進行大量單獨的更新。 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2747627&SiteID=1

+0

感謝您對InsertAllOnSubmit的支持......我不知道這一點。 – Abhijeet 2008-12-24 10:03:08

1

請注意,您並未實際提交這些更改,並且理想情況下您應該確定using上下文以確保獲得Dispose() d。

重新獲得最佳效果 - LINQ到SQL中存在一個小故障 - 通過Single(pred)SingleOrDefault(pred)方法獲取單個記錄的最佳方法是,因爲這些方法使用身份管理器進行主鍵查詢。含義:如果您通過主鍵詢問juts,並且數據上下文已知道該記錄,則它不會觸及數據庫。大多數其他查詢命中數據庫(包括.Where(pred).Single())。因此,如果Name是主鍵,我會調整到:

db.SingleOrDefault(tag => tagName == tag.Name) 

在這種情況下,它可能沒有太大的差別(因爲上下文可能不會看到它),但它是很好的瞭解。

相關問題