У меня есть 3 таблицы в моей БД, которые я работаю с:Linq для субъектов запроса оптимизируя
Theme [Theme_ID]
ThemeWorkplace [Theme_ID, Workplace_ID, ThemeWorkplace_ID]
UserTheme [User_ID, Theme_ID, UserTheme_ID, UserTheme_AccessType]
мне нужно изменить UserTheme_AccessType
для всех UserTheme.Theme_ID
на рабочем месте с ThemeWorkplace.Workplace_ID = 2
и текущим пользователем с User_ID = 1
. Если тема не является строкой в UserTheme
для такого пользователя и такой темы - мне нужно ее создать.
я написал такой код, но он работает слишком долго:
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);
}
Возможно, вам будет полезно разместить информацию о том, как работает функция GetByUserTheme. –
Спасибо, я добавил оператор GetByUserTheme. –