0

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

    }

如何将此删除循环更改为 Date <= @twodaysold 的 News 中的单个删除?如果我这样做,我想它会提供更好的性能。

此方法位于我的项目中经常使用的存储库文件中。

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。任何形式的帮助表示赞赏。

4

2 回答 2

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()

}
于 2013-07-04T20:14:42.673 回答
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);
}
于 2013-07-04T20:22:05.313 回答