我在DB 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'如何'工作机制的细节是有用的。 – 2013-02-12 11:36:05
谢谢,我已经添加了GetByUserTheme声明。 – 2013-02-12 11:45:48