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

    }

この削除ループを News から Date <= @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);
    }
}

ニュース アイテムのタイトルがデータベースに既に存在するかどうかを確認し、存在する場合はアイテムを削除し、そうでない場合は追加します。私はそれがひどく作られていることを知っています。より適切に最適化するには、upset/を実行する必要がありmergeます。どんな種類の助けも大歓迎です。

4

2 に答える 2

1

残念ながら、EF はセット ベースの操作をネイティブにサポートしていませんが、ある段階で追加したいと考えています ( http://entityframework.codeplex.com/discussions/376901で自由に 2 セント追加してください) 。

ただし、セットベースの削除のサポートを追加する拡張機能がありますが、この方法のパフォーマンスについてはよくわかりません。これを試す前後にベンチマークを行う価値があります。https://github.com/loresoft/EntityFramework.Extended

注意すべきもう 1 つの重要な点は、SaveChanges を 1 回だけ実行することでパフォーマンスを大幅に改善できることです。これは、EF が一度にすべてを DB にプッシュし、データベース サーバーへの 1 回のラウンドトリップを待つだけで済むことを意味します。例えば

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 に答える