2009-08-05 3 views
1

데이터 액세스를 위해 LINQ to SQL을 사용하여 사용자 지정 역할 공급자를 만들었습니다. 공급자를 위해 작성해야하는 기능 중 하나는 역할에서 사용자를 제거하는 것입니다.LINQ to SQL 다 대다 비교 쿼리

public void RemoveUsersFromRoles(string[] usernames, string[] rolenames); 

이제 한 가지 방법이 있습니다. 더 나은이있는 경우

  • 각 역할에 대한 반복 처리하고 그 역할이있는 모든 사용자에서 해당 역할을 제거는
  • 이러한 접근 방식은 효율적 거리가 멀다 역할 목록 내가 좋아하는 것

    1. 반환 알고 LINQ to SQL에서 이러한 유형의 문제를 처리하는 방법.

      LINQ to SQL에서 루프를 만들고 N 개의 선택을하는 대신 문자열 배열을 사용하는 SELECT 문을 만드는 방법이 있습니까? 위에 설명 된 것보다 더 나은 접근 방법이 많이 감사 할 것입니다. 참여

      테이블 :

      User (RecordID, Username) 
      Role (RecordID, Rolename) 
      UsersInRole (RoleID,UserID) 
      

      당신을 감사합니다!

    답변

    4

    이 작동합니다 : SQL에

    var uirQuery = from uir in db.UsersInRole 
           join u in db.User on uir.UserID equals u.RecordID 
           join r in db.Role on uir.RoleID equals r.RecordID 
           where usernames.Contains(u.Username) 
            && rolenames.Contains(r.Rolename) 
           select uir; 
    
    db.UsersInRole.DeleteAllOnSubmit(uirQuery); 
    

    LINQ는 절에 T-SQL에 "포함"표현을 변환합니다.

    +0

    그냥 코드를 향상 시키려면 :위 쿼리에서 전체 단어를 * far *보다 읽기 쉽도록 작성하면됩니다 .U => user, r => role, uir => usersInRole. –

    +0

    각 사용자와 역할에 대해이 쿼리를 반복해야합니다. – Lukasz

    +0

    아니요.이 쿼리는 메서드에 대한 인수에 지정된 user + role의 조합과 일치하는 모든 UsersInRole 레코드를 반환합니다. 당신은 쿼리를 한 번만 실행하여 관련 레코드를 가져 오거나 삭제할 수 있습니다. –