我有一些方法可以更好地进行优化,如果有人能够解释解决方案,那将会非常有帮助。我正在使用ASP.NET MVC 4和Entity-framework。
首先我有这个方法:
//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();
}
}
如何将此删除循环更改为来自新闻的单个删除日期&lt; = @twodaysold?我想如果我这样做会有更好的表现。
此方法位于我的存储库文件中,该文件在我的项目中很常用。
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);
}
}
它的作用是检查新闻项目标题是否已经存在于数据库中,如果它确实删除了它添加的项目。我知道这是糟糕的。为了更好地优化maby,我应该upset
/ merge
。任何形式的帮助都表示赞赏。
答案 0 :(得分:1)
不幸的是,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()
}
答案 1 :(得分:0)
您可以使用RemoveAll()方法删除所有或选定的项目:
DeleteNews(x => x.Date <= DateTime.Now.AddDays(-2));
要执行此操作,您必须稍微更改模型,并使DeleteNews()方法接受谓词作为参数。然后在方法中使用此代码。
应该是这样的:
public void DeleteNews(Predicate<News> item)
{
//myList is list of News
myList.RemoveAll(item);
}