0

我的数据库中有 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

我不知道我是否完全理解你的问题和结构。但根据我所看到的,这可能是一个合理的解决方案吗?

首先,您选择 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 回答
0

第一:您在代码中对实体所做的所有更改都将在您调用context.SaveChanges. 因此,您将对数据库有一个选择请求和一个更新请求。

但是在您的批处理命令中将有许多 sql 查询,因为 EF 会为更新实体一一生成 sql(不是全部合二为一)。

如果你想更新数据库中的很多记录,你应该使用 sql 脚本(调用存储过程或执行 sqlquery)而不是使用 EntityFramework。

于 2013-02-12T11:55:33.283 回答