2013-02-12 9 views
0

내가 함께 일하고 있어요 내 DB에서 3 개 테이블이 :Linq에

  1. Theme [Theme_ID]
  2. ThemeWorkplace [Theme_ID, Workplace_ID, ThemeWorkplace_ID]
  3. UserTheme [User_ID, Theme_ID, UserTheme_ID, UserTheme_AccessType]
  4. 내가 모든 UserTheme_AccessType을 변경해야

현재 직장에서 ThemeWorkplace.Workplace_ID = 2이고 현재 사용자가 User_ID = 1UserTheme.Theme_ID입니다. 그런 사용자 및 주제에 대한 테마가 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; 
    } 
} 

는이 코드가 데이터베이스를 여러 번 액세스하는 것을 이해합니다. 나는 제거하는 방법을 찾으려면 : 모든 foreach 반복에서

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

합니다. 누군가 제발 도와 주실 수 있나요? 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); 
} 
+1

'GetByUserTheme'의 작동 방식에 대한 세부 정보를 게시하는 것이 유용 할 수 있습니다. –

+0

고맙습니다. GetByUserTheme 문을 추가했습니다. –

답변

0

: 당신이 코드에서 수행 한 개체에 대한 모든 변경 사항이 하나 개의 배치 명령에 데이터베이스에 푸시됩니다 context.SaveChanges에 전화 할 때. 따라서 선택을 위해 데이터베이스에 하나의 요청을하고 업데이트를 한 번 요청합니다.

그러나 배치 명령에서 EF가 업데이트 엔티티에 대해 SQL을 하나씩 생성하므로 (하나만있는 것은 아님) 많은 SQL 쿼리가 발생합니다.

데이터베이스에서 실제로 많은 레코드를 업데이트하려면 EntityFramework를 사용하는 대신 sql 스크립트 (저장 프로 시저 호출 또는 sqlquery 호출)를 사용해야합니다.

+0

이 설명에 감사드립니다. 어떻게 내부 깊숙히 작동하는지 Entity freemework를 연구하는 것이 나에게 더 좋습니다. –

0

나도 몰라. 그러나 내가 본 것에 근거 할 때 이것은 합리적인 약화가 될 수 있습니까?

먼저 ID가 2 인 작업 공간을 선택하십시오. 그 결과에서 테마 ID를 선택하십시오. 그러면 이전 결과에서 발생하는 themeID를 가진 모든 userthemes가 'userThemes'로 선택됩니다. 거기에서 결과를 반복하고 사용자 ID가 비어 있으면 새 UserTheme을 만들고 그렇지 않으면 사용자 ID를 업데이트합니다.

빠른 참고 : 아래 코드는 실제 작동하는 코드가 아닙니다. 만약에 당신이 내 설명을 예시 쓴 단지 코드, 의사 코드의 종류의 .. :)

먼저
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; 
}