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

时间:2013-07-04 19:55:35

标签: c# entity-framework lambda repository

我有一些方法可以更好地进行优化,如果有人能够解释解决方案,那将会非常有帮助。我正在使用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。任何形式的帮助都表示赞赏。

2 个答案:

答案 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);
}