在通过Linq插入到SQL之前检查是否存在
问题描述:
我想知道是否有一种更简单的方法来批量插入一组记录,如果它们不存在于表中。例如,我在数据库中有一个标签表,它具有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);
}
有没有更好的方法?
答
我不确定,但我实际上认为这是最优的。我认为改进性能的唯一方法是提高性能(如果至关重要),那就是使用SP,通过linq to sql可以访问SP。
请记住,InsertAllOnSubmit命令不会执行批量更新,只是进行大量单独的更新。 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2747627&SiteID=1
答
请注意,您并未实际提交这些更改,并且理想情况下您应该确定using
上下文以确保获得Dispose()
d。
重新获得最佳效果 - LINQ到SQL中存在一个小故障 - 通过Single(pred)
或SingleOrDefault(pred)
方法获取单个记录的最佳方法是,因为这些方法使用身份管理器进行主键查询。含义:如果您通过主键询问juts,并且数据上下文已知道该记录,则它不会触及数据库。大多数其他查询做命中数据库(包括.Where(pred).Single()
)。因此,如果Name
是主键,我会调整到:
db.SingleOrDefault(tag => tagName == tag.Name)
在这种情况下,它可能没有太大的差别(因为上下文可能不会看到它),但它是很好的了解。
感谢您对InsertAllOnSubmit的支持......我不知道这一点。 – Abhijeet 2008-12-24 10:03:08