如何优化这两个执行DB操作的代码片段,以获得更好的性能



我有一些方法可以更好地优化,如果有人也能解释解决方案,那将非常有帮助。我使用的是带有实体框架的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);
}

最新更新