0

私が使用しているDBには3つのテーブルがあります:

  1. Theme [Theme_ID]
  2. ThemeWorkplace [Theme_ID, Workplace_ID, ThemeWorkplace_ID]
  3. UserTheme [User_ID, Theme_ID, UserTheme_ID, UserTheme_AccessType]

現在の職場と現在のユーザーUserTheme_AccessTypeのすべてを変更する必要があります。そのようなユーザーとそのようなテーマのテーマが列にない場合は、作成する必要があります。UserTheme.Theme_IDThemeWorkplace.Workplace_ID = 2User_ID = 1UserTheme

私はそのようなコードを書きましたが、あまりにも長く動作します:

var themeList = (from t in m_Entities.Theme
                    where (from tw in m_Entities.ThemeWorkplace
                        where tw.Workplace.Workplace_ID == 2
                        select tw.Theme.Theme_ID).Contains(t.Theme_ID)
                            select t)
                .ToList();

foreach (Theme theme in themeList)
{
    var oldUserTheme = GetByUserTheme(user/*user is given*/, theme);

    if (oldUserTheme == null)
    {
        /* create new User Theme with params, that I need*/
        this.Add(newUserTheme, true);
    }
    else
    {
        /* here - changing found row */
        oldUserTheme.UserTheme_AccessType = 2;
    }
}

このコードがデータベースにアクセスする回数が多すぎることを理解しています。私は取り除く方法を見つけたい:

var oldUserTheme = GetByUserTheme(user/*user is given*/, theme);

すべてのforeach反復で。誰か助けてくれませんか?

GetByUserTheme() のコードを追加:

private UserTheme GetByUserTheme(User user, Theme theme)
{
    return m_Entities.UserTheme.FirstOrDefault(ut => ut.User.User_ID == user.User_ID && ut.Theme.Theme_ID == theme.Theme_ID);
}
4

2 に答える 2

0

最初:コードで行ったエンティティのすべての変更は、を呼び出すときに1つのバッチコマンドでデータベースにプッシュされますcontext.SaveChanges。したがって、データベースへの選択要求と更新要求が1つずつあります。

ただし、バッチコマンドには、EFが更新エンティティのSQLを1つずつ生成するための多くのSQLクエリが含まれます(すべてが1つではありません)。

データベース内の非常に多くのレコードを更新する場合は、EntityFrameworkを使用するのではなく、SQLスクリプトを使用する(ストアドプロシージャを呼び出すか、sqlqueryを実行する)必要があります。

于 2013-02-12T11:55:33.283 に答える
0

あなたの質問と構造を完全に理解しているかどうかはわかりません。しかし、私が見たものに基づいて、これは合理的な解決策である可能性がありますか?

まず、IDが2に等しい職場を選択します。その結果からテーマIDを選択します。前の結果で発生するthemeIDを持つすべてのユーザーテーマは、「userThemes」に選択されます。そこから、結果を繰り返し処理し、userIDが空の場合は、新しいUserThemeを作成します。それ以外の場合は、更新します。

クイックノート:以下のコードは実際に機能するコードではありません。それは私の説明を例示するために私が書いたコードであり、あなたがそうするなら一種の擬似コードです.. :)

var userThemes = entities.Userthemes
                         .Where(ut => entities.Workplaces
                                              .Where(w => w.WorkPlaceID == 2)
                                              .Select(s => s.ThemeID)
                                              .Contains(ut.ThemeID));

foreach (UserTheme ut in userThemes)
{
    if (ut.UserID.ToString() == "")
    {
        //Create
    }
    else
        ut.UserThemeAccessType = 2;
}
于 2013-02-12T11:45:10.753 に答える