2012-09-18 5 views
1

entity model복잡한 EF 그래프 LINQ는

그래서, 그게 내 모델 .. 좋은 복잡 가입 할 수 있습니다.

사용자 ID별로 지역을 찾으려고합니다. SQL에서이 작업을 수행했다면 사용자 테이블까지 모든 조인을 수행 할 것입니다. LINQ 쿼리 구문 또는 메서드 체인에서이 작업을 어떻게 수행합니까?

다른 방법으로도이 작업을 매우 간단하게 수행 할 수 있지만 결과 그래프를 평행하게 만들기 위해서는 많은 작업을해야하며 그 사이의 모든 엔티티를 다시 가져와야합니다.

내가 선택 사항으로 AreasPermissions & 권한을 포함 할 수 있다면 그 육즙이 될 수 있지만,이 시점에서 나는 이들을 가져 오기위한 추가 쿼리에 신경 쓰지 않을 것입니다.

다른 옵션은 sproc에 함수 가져 오기를 사용하여 Area에 매핑하는 것이 었습니다.하지만 다른 엔티티를 포함 할 필요가있을 때 그 옵션을 덜 우아하게 만듭니다. 또한 sprocs 사용을 피하려고합니다. 그냥 sprocs를 사용하는 것입니다. 항상 사람들과 함께 미끄러운 슬로프이기 때문입니다. '한 가지에 대해 sproc 사용'은 'EF (테이블 액세스)를 사용하지 마십시오' .

var userByID = new Func<User, bool>(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase)); 
var user = this._context.Users 
    .Include("TeamsUsers.Team.TeamsRoles.Role.RolesAreasPermissions.AreaPermission.Area") 
    .Include("TeamsUsers.Team.TeamsRoles.Role.RolesAreasPermissions.AreaPermission.Permission") 
    .Single(userByID); 

답변

4

나는이 테스트 방법이 없습니다,하지만 난이 일을해야한다고 생각 :

var result = 
    from user in _context.Users 
    where user.Id == userId 
    from teamUser in user.TeamUsers 
    from teamRole in teamUser.Team.TeamRoles 
    from roleAreaPermission in teamRole.Role.RoleAreaPermissions 
    select roleAreaPermission.AreaPermission.Area; 
+0

감사 다윗, 큰 일 것으로 보인다 조금 수정과. 중간 엔터티 (User 포함) 반환을 피할 수 있는지 궁금하고 메서드 구문을 사용하여이를 수행하는 방법에 대해 궁금합니다. – JoeBrockhaus

+0

@JoeBrockhaus 질의는'select' 문에있는 것을 반환하기 때문에'Areas' 만 반환합니다. –

+0

@JoeBrockhaus 당신은'SelectMany' 메소드 구문을 사용하여이 쿼리를 작성할 수 있습니다.하지만 이상하게 보일 것입니다. 그리고 이것은 훨씬 더 읽기 쉽습니다. –