2011-02-16 2 views
8

db 스키마에 여러 개의 parent> child> grandchild 관계가 있습니다. 대개 부모님이 있는데 손자에 대한 정보가 필요합니다. 예를 들어 친구 컬렉션이있는 소셜 네트워크 모음을 가진 사용자가 있습니다. 나는이 코드를 반복해서 쓰는 것을 발견한다.linq을 사용하여 부모로부터 손자 오브젝트를 검색하는 방법

linq으로 더 세련된 방법이 있습니까?

내가 할 수있게하고 싶은 것은 "user.Friends"이지만 친구 테이블에 외래 키를 넣어야 만하고 냄새가 나지 않습니다. 다음과 같이 표시됩니다.

User   {Id,..} 
SocialNetwork {Id, UserId, ...} 
Friend  {Id, SocialNetworkId, UserId, ... } 

생각 하시겠습니까?

당신은 User 클래스에하는 방법으로 한 번만 코드를 작성할 수 있습니다

답변

13

:

var friends = user.UserSocialNetworks.SelectMany(socialNtwk=>socialNtwk.Friends); 
+2

SelectMany!?! 누가 생각 했습니까? :) 고마워! – DanielEli

0

나는이 오래된 알고,하지만 난했습니다 : 또는

partial class User 
{ 
    public IEnumerable<Friend> Friends() 
    { 
    return from socialNetwork in this.UserSocialNetworks 
      from friend in socialNetwork.Friends 
      select friend; 
    } 
} 

, 당신은 단지 SelectMany() 사용할 수 최근에 똑같은 문제에 직면했고 대안은 반대 방향으로 나아가는 것입니다. 사용자에서 시작하여 드릴 다운하지 않고 친구 (또는 조부모)를 기준으로 필터링을 시작하십시오. 이를 위해 사용자의 ID가 필요합니다. 계층 구조가 깊어지면 더 쉽게 읽을 수 있습니다. 다음과 같음 :

return _db<your entities>.Friend 
    .Where(f => f.SocialNetwork.User.Id == userId) 
    .ToList(); 
관련 문제