2012-04-24 2 views
1

많은 관계가 매핑 된 클래스가 있습니다. 구체적인 사용자에 대해 이러한 관계 중 하나를 가져와야합니다. 내가 일하기 stocks지도를 어떻게유창한 nhibernate 왼쪽 합류 늦은 바운드, 런타임 값

public class Company 
{ 
    public int id { get; set; } 
    public string Name { get; set; } 
    public IList<StocksPack> stocks { get; set; } 
    // a lot of other properties referencing other objects 
} 

public class StocksPack 
{ 
    public int stockId { get; set; } 
    public int companyId { get; set; } 
    public int amount { get; set; } 
    public int ownerId { get; set; } 
} 

왼쪽 외부 조인 사용자가 시스템에 로그온 한 후, 실제 ownerId 만 런타임에 알려져있다 ON stocks.companyId = company.id AND stocks.ownerId = 123456

합니다. 구체적인 사용자에 대해 회사에 대한 모든 정보와 그 회사의 Stocks 목록을 얻고 싶습니다.

답변

0

질문의 전제가 잘못되었다고 생각합니다. 왼쪽 외부 조인에서 개체를 매핑하지 마십시오. 당신은 다음과 같은 class map와 외래 키 참조 데이터베이스 나 NHibernate에에 그들을지도 :

public class StockeMap : ClassMap<Stock> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     References(x => x.company); 
    } 
} 
주식처럼 보였다

:

public class Stock{ 
    public virtual Company company {get; set;} 
} 

그리고 당신은지도와 일부 회사 객체를했다 설정하면 id 필드가됩니다. 이것은 주식 및 회사와 관련된 간단한 부모 자식 ID 유형 관계입니다. 나는 추측하고있다. hibernate와 nhibernate의 개념은 객체에 ID 참조가있을 필요가 없다는 것입니다. 그것은 당신을 위해 처리합니다.

데이터를 쿼리 할 때 왼쪽 외부 조인 만 입력됩니다. 즉, 매핑은 두 유형 간의 관계입니다. 쿼리는 관계를 표현하는 방법과 원하는 데이터에 대한 설명입니다. 전자는 데이터 모델 및 시스템 설계의 속성이며 나중에 런타임에 발생하는 이벤트입니다.

쿼리에 대해 원하는 내용에 약간의 모호성이 있지만 모든 주식을 나열하고 특정 주식 소유주가 해당 주식을 소유하고 있으면 해당 주식도 나열하려는 것으로 보입니다. 다른 가능성은 당신이 모든 회사를리스트하고 싶을 때, 그리고 특정 id에 의해 소유 된 주식이 있다면, 그 주식도리스트하고자하는 것입니다.

두 경우 모두 간단한 왼쪽 결합 쿼리가 필요합니다. 유창 bhibernate에서 이러한 this 같이 :

from Cat as cat 
    left join cat.kittens as kitten 

C#에서이 example를 사용할 수 LINQ를 사용하여 :

var query = from person in people 
        join pet in pets on person equals pet.Owner into gj 
        from subpet in gj.DefaultIfEmpty() 
        select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) }; 
0

당신은 "Filtering collections"라는 기능을 사용할 수 있습니다. 원하는 경우 내가 언급 한 엔티티를 사용하여 샘플 애플리케이션을 만들 수 있습니다.