我想知道是否有更简单的方法来批量插入一组记录(如果它们尚未存在于表中)。例如,我在数据库中有一个标签表,其中包含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);
}
有更好的方法吗?
答案 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)
在这种情况下,它可能没有多大区别(因为上下文可能不会看到它),但是知道它很好。