如何优化这两个执行DB操作的代码片段,以获得更好的性能
本文关键字:片段 代码 性能 操作 更好 执行 优化 何优化 两个 DB | 更新日期: 2023-09-27 18:21:09
我有一些方法可以更好地优化,如果有人也能解释解决方案,那将非常有帮助。我使用的是带有实体框架的ASP.NET MVC 4。
首先我有这个方法:
//gets all the items by id
var GetAllItems = re.GetAllWorldNewsByID();
// loops through all items
foreach (var newsitemz in GetAllItems)
{
if (newsitemz.Date <= DateTime.Now.AddDays(-2))
{
re.DeleteNews(newsitemz);
re.save();
}
}
如何将此删除循环更改为从日期<=@卖了两天?我想如果我那样做会有更好的表现。
这个方法在我的项目中经常使用的存储库文件中。
public void AddNews(News news)
{
var exists = db.News.Any(x => x.Title == news.Title);
if (exists == false)
{
db.News.AddObject(news);
}
else
{
db.News.DeleteObject(news);
}
}
它所做的是检查新闻标题是否已经存在于数据库中,如果存在,它会删除该项目,否则它会添加它。我知道这是糟糕的。为了更好地优化它,我应该做一个upset
/merge
。任何形式的帮助都将不胜感激。
不幸的是,EF本机不支持基于集的操作,尽管这是他们希望在某个阶段添加的内容(请随意在此处添加您的两美分http://entityframework.codeplex.com/discussions/376901)
然而,有一个扩展确实增加了对基于集的删除的支持,但我不太确定这种方法的性能,在尝试之前和之后进行基准测试是值得的。https://github.com/loresoft/EntityFramework.Extended
另一个需要注意的关键是,只执行一次SaveChanges可以显著提高性能,这意味着EF将一次将所有内容推送到数据库,只需等待一次到数据库服务器的往返。例如
foreach (var newsitemz in GetAllItems)
{
if (newsitemz.Date <= DateTime.Now.AddDays(-2))
{
re.DeleteNews(newsitemz);
}
re.save(); //assuming this is basically context.SaveChanges()
}
您可以使用RemoveAll()方法删除所有或选定的项目:
DeleteNews(x => x.Date <= DateTime.Now.AddDays(-2));
要做到这一点,您必须稍微更改您的模型,并让DeleteNews()方法接受一个谓词作为参数。然后在方法中使用此代码。
应该是这样的:
public void DeleteNews(Predicate<News> item)
{
//myList is list of News
myList.RemoveAll(item);
}