J'ai 3 tables dans ma DB qui je travaille:LINQ to Entities requête optimisation
Theme [Theme_ID]
ThemeWorkplace [Theme_ID, Workplace_ID, ThemeWorkplace_ID]
UserTheme [User_ID, Theme_ID, UserTheme_ID, UserTheme_AccessType]
Je dois changer UserTheme_AccessType
pour tous UserTheme.Theme_ID
dans le lieu de travail actuel avec ThemeWorkplace.Workplace_ID = 2
et utilisateur actuel avec User_ID = 1
. Si le thème n'est pas une ligne UserTheme
pour un tel utilisateur et un tel thème - je dois le créer.
j'ai écrit un tel code, mais il fonctionne trop longtemps:
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;
}
}
Je comprends que ce code accède trop de fois la base de données. Je veux trouver un moyen de se débarrasser de:
var oldUserTheme = GetByUserTheme(user/*user is given*/, theme);
Dans chaque itération foreach
. Quelqu'un pourrait m'aider s'il vous plaît?
Ajout de code de 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);
}
Il peut être utile d'afficher les détails du fonctionnement de 'GetByUserTheme'. –
Merci, j'ai ajouté l'instruction GetByUserTheme. –