2017-12-01 23 views
0

1 대 다 관계의 3 개의 관련 엔티티가 있습니다. 계정 1 * 이들 각각은, 사용자와 많은 관계에 많은있다다 대 다 관계 필터링하기

컬렉션 1 개 * 항목

I 수집품의 목록을 얻으려고 (테이블 AccountManagers, CollectionManagers, ItemManagers 가입 포함) 사용자가 조인 테이블에있는 경우. 3 개의 표현식을 작성한 다음 끝에 3 개의 결과를 병합하여 중복을 제거합니다. 람다식이 가야 할 길인 것 같았지만 아직 배우고 있습니다. 당신이 사용자의 컬렉션의 목록을 수집 할 방법 관리자 계정

그러나

내가 db.Collections.where처럼, 중간 사람이 쉽게 생각 (C => C.CollectionManagers.UserID == CurrentUserID) 및 항목 관리자 항목? LINQ를 사용하여 사전

+0

'CollectionManagers' 많은에 많은의 목록입니다 (C => c.CollectionManagers.Any (A => a.UserID == CurrentUserID))'. – NetMage

+0

당신이 이야기하고있는 엔터티 클래스의 관련 부분 (특히 탐색 속성)을 게시하면 훨씬 쉽게 당신을 도울 수 있습니다. –

답변

0

에서

덕분에, Union 운영자는 각각의 범주를 조립하고 작동합니다 결합 만의 고유 컬렉션 행을 반환합니다.

이 항목에 대한, 나는 현재 사용자가 관리하는 모든 항목을 찾을 수 가장 효율적하고 자신이 속한 모든 컬렉션을 찾을 것이라고 생각 :

var iCollections = Items.Where(i => i.ItemManagers.Any(im => im.UserId == CurrentUserID)).SelectMany(i => Collections.Where(c => c.Items.Contains(i))); 

이 다른 방법으로 할 수도 있습니다, 예

var cCollections = Collections.Where(c => c.CollectionManagers.Any(cm => cm.UserId == CurrentUserID)); 

: 당신이 지적했듯이, 당신은 단지 현재 사용자가 컬렉션을 관리하는 경우 모든 컬렉션을 찾을 필요가

모음에 대한
var iCollections = Collections.Where(c => c.Items.Any(i => i.ItemManagers.Any(im => im.UserId == CurrentUserID))); 

: 현재 사용자에 의해 관리 항목을 포함하는 모든 컬렉션을 찾을 수

var aCollections = Accounts.Where(a => a.AccountManagers.Any(am => am.UserId == CurrentUserID)).SelectMany(a => a.Collections); 

그런 다음 당신이 resu을 Union 수 있습니다 계정의 경우, 우리는 계정이 소유 현재 사용자가 관리하는 모든 계정 및 모든 컬렉션을 찾을 수 함께 LTS : 당신이 더 Collections.Where`같은 뭔가가 필요하므로

나는 가정
var CurrentUserCollections = iCollections.Union(cCollections).Union(aCollections); 
+0

감사합니다. 나는 당신이 다른 진술 안에 "i"를 더 넣을 수 있다는 것을 깨닫지 못했습니다.)). SelectMany (i => Collections.Where (c => c.Items.Contains (i))); – Rob

+0

lambda는 단지 함수의 축약 인 델리게이트의 축약이며 블록처럼 부모 범위에 대한 액세스 권한이 있음을 기억하십시오. – NetMage