0

次のコードがあるとします。

public static void SomeLoop()
{
    using(var db = new ArcadeContext())
    {
        var changeRecs = db.ArcadeGameRanks.Where(c => c.Date == today);
        foreach (var rankRecord in changeRecs)
        {
            var rank = SomeMethod(rankRecord.GameID);
            UpdateGamesCatRank(rankRecord.GameID, rank);
        }
    }
}

public static void UpdateGamesCatRank(int gameID, int catRank)
{
    using(var db = new ArcadeContext())
    {
        db.ExecuteCommand("UPDATE ArcadeGame SET CategoryRank = " + catRank + " WHERE ID = " + gameID);
    }
}

SQL Server プロファイラーを実行すると、パフォーマンスに影響を与えると思われるメッセージが繰り返しAudit Login表示Audit Logoutされます。

ここに画像の説明を入力

私は C# を独学で学んでいるので、普段とは違うことをしている可能性が高いことはわかっています。

私の質問は、上記のデザインパターンは良いと考えられていますか? または、関数が呼び出されるたびに再確立する必要がないように、データコンテキストを関数へのパラメーターとして再利用/渡す必要がありますか? (新しいデータコンテキストの繰り返し作成がログインとログアウトの原因であるという私の仮定の場合)。

4

2 に答える 2

1

コンテキストは既にインスタンス化されているため、メソッドに渡します。

public static void SomeLoop()
{
    using(var db = new ArcadeContext())
    {
        var changeRecs = db.ArcadeGameRanks.Where(c => c.Date == today);
        foreach (var rankRecord in changeRecs)
        {
            var rank = SomeMethod(rankRecord.GameID);
            UpdateGamesCatRank(rankRecord.GameID, rank, db);
        }
    }
}

public static void UpdateGamesCatRank(int gameID, int catRank, ArcadeContext db)
{
    db.ExecuteCommand("UPDATE ArcadeGame SET CategoryRank = " + catRank + " WHERE ID = " + gameID);
}

これにより、foreach ループが完了したときにコンテキストを破棄することで、クエリが実行され、返され、解決されます。

于 2013-06-13T14:29:55.400 に答える
0

良い考えではありません。それはあなたの要点を説明するための単なる例かもしれませんが、SQL コマンドを実行するためだけにまったく新しいメソッドが必要になるとは思いません。そのコマンドをループに入れるだけです。呼び出しごとに新しい db コンテキストをインスタンス化すると、パフォーマンスが低下します。

于 2013-06-13T14:31:34.030 に答える