2010-01-18 2 views
1

Linq-to-SQL 엔터티를 가져 와서 엔티티 집합에 포함 된 데이터가없고 이름 만있는 모든 자식 (1 세대 만) 엔터티 집합의 목록을 반환해야합니다. 내가 할 수있는 방법이 있니? 감사합니다엔터티 자식을 열거하십시오

답변

1

음, 정확하게 질문을 이해하면 데이터 컨텍스트 인스턴스에 대한 메타 모델을 검사 할 수 있습니다. 메타 모델은 모델의 테이블, 열 및 연관을 설명합니다. 기본적으로 당신은 협회가 1 대 다수 인 테이블에서 협회를보고 싶습니다.

실제로 엔티티 인스턴스로 작업하지 않으므로 데이터를 검색하는 것이 아니라이를 설명하는 정보 만 포함합니다.

이 코드를 수행해야합니다

public static string[] GetChildEntities<T>(DataContext context, T entity) 
{ 
    var mapping = context.Mapping.GetTable(typeof(T)); 
    return mapping.RowType.Associations.Where(a => a.IsMany) 
             .Select(a => a.ThisMember.Name).ToArray(); 
} 

이 지정된 친 실체에 대한 EntitySet 인스턴스를 노출 어떤 속성의 이름을 반환합니다.

편집이 코드는 제 1 발견

- 메타 모델에 기초하여, 상위 및 하위 개체 간의> * 연관 부모 엔티티에 EntitySet 속성 값을 검색하고, 자식을 추가 엔티티를 설정합니다. 이 기능은 대부분의 기본 LINQ to SQL 구현에서 작동합니다.

public static void AddChild<P, C>(DataContext context, P parent, C child) 
    where P : class 
    where C : class 
{ 
    var parentMapping = context.Mapping.GetTable(typeof(P)); 
    var childAssociation = 
      parentMapping.RowType.Associations 
        .Where(a => a.IsMany && a.OtherType.Type == typeof(C)) 
        .FirstOrDefault(); 

    if (childAssociation != null) 
    { 
     var entitySet = (EntitySet<C>) childAssociation.ThisMember 
                 .MemberAccessor 
                 .GetBoxedValue(parent); 
     entitySet.Add(child); 
    } 
}
+0

예, 그게 내가 바라는 것이고, 그 방향을 가리켜 주셔서 감사합니다. 내 목표는 자식 엔티티와 부모를 모두 가져 와서 적절한 엔티티 집합으로 "ThisMember"를 캐스팅하고 그 유형에 상관없이 거기에 자식을 추가하는 메서드를 만드는 것입니다. 그걸 도와 줄 수있어? 귀하의 방법은 확실히 올바른 단계입니다. – Victor

+0

이 방법은 연결이 끊어진 항목에서도 작동합니다. – Victor

관련 문제