2008-12-21 92 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) 

在这种情况下,它可能没有太大的差别(因为上下文可能不会看到它),但它是很好的了解。

相关问题