在通过Linq插入SQL之前检查是否存在

时间:2008-12-21 00:03:13

标签: .net sql linq

我想知道是否有更简单的方法来批量插入一组记录(如果它们尚未存在于表中)。例如,我在数据库中有一个标签表,其中包含ID,名称列 - 给定一个标签名称列表,我只想添加那些尚未存在的标签名称。这就是我想出的:

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);
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我不确定,但我认为这是最佳的。我认为提高性能的唯一方法就是使用SP,可以通过linq to sql访问SP。

请记住,InsertAllOnSubmit命令不会进行批量更新,只需进行大量单独更新。 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2747627&SiteID=1

答案 1 :(得分:1)

请注意,您实际上并未提交这些更改,理想情况下,您应该using上下文以确保其获得Dispose() d。

重新优化 - LINQ-to-SQL存在一个小问题 - 获取单个记录的最佳方法是通过Single(pred)SingleOrDefault(pred)方法,因为这些方法使用标识主键查询管理器。含义:如果您通过主键询问juts,并且数据上下文已经知道该记录,则它不会命中数据库。大多数其他查询执行命中数据库(包括.Where(pred).Single())。因此,如果Name是主键,我会调整为:

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

在这种情况下,它可能没有多大区别(因为上下文可能不会看到它),但是知道它很好。