2012-10-26 4 views
0

저는 Project와 Customer Model을 가지고 있습니다. 프로젝트 모델에 <many-to-one> mapping.in 데이터베이스가있는 고객 개체가 있습니다. 고객이 있지만 프로젝트 테이블에 항목이없는 경우 일 수 있습니다.NHibernate.SqlCommand.JoinType.RightOuterJoin을 사용하는 방법?

고객이 프로젝트 또는 고객 이름을 입력 할 수있는 CustomerSearch 기능을 수행하고 있습니다. 사용자가 customname을 입력 한 경우에만 고객에게 프로젝트가 있는지 고려하지 않고 CustomerName과 일치하는 모든 레코드를 원합니다.

나는 서비스에서 이것을 시도했다.

ICriteria criteria = session.CreateCriteria(typeof(Project),"Project") 
        .CreateAlias("Project.customer","customer",NHibernate.SqlCommand.JoinType.RightOuterJoin) 
        .CreateAlias("Project.Coordinator", "Coordinator", NHibernate.SqlCommand.JoinType.InnerJoin); 

       if (!string.IsNullOrEmpty(custName)) 
       { 
        criteria.Add(Expression.Like("customer.Name", custName, MatchMode.Start)); 
       } 
       if (!string.IsNullOrEmpty(projectName)) 
       { 
        criteria.Add(Expression.Like("Project.Name", projectName, MatchMode.Start)); 
       } 

       projectList = criteria.List<Project>().ToList(); 

프로젝트 테이블에 고객 레코드가 없지만 고객 테이블에 해당 레코드가 있어야하기 때문에 고객에게 RightOuterJoin을 사용했습니다.

이 코드는 projectList이 목록에 있지만 프로젝트 테이블에 레코드가없는 일부 항목이 null 인 경우에도 오류를주지 않습니다.

어떻게 그러한 기록을 얻을 수 있습니까?

답변

0

오른쪽 조인을 사용하면 프로젝트의 모든 필드가 null이므로 NH는 유효한 프로젝트 개체 (ID 누락)를 작성할 수 없으므로 null을 반환합니다.

NH는 null 프로젝트와 관련하여 무엇을해야할지 알거나 프로젝트없이 고객에게 seperatly 쿼리합니다 (Futures에서는 별도의 왕복이 필요함).

class SearchResult 
{ 
    public int ProjectId { get; set; } 
    public string ProjectName { get; set; } 
    public int CustomerId { get; set; } 
    public string CustomerName { get; set; } 
} 


ICriteria criteria = session.CreateCriteria(typeof(Project)) 
    .CreateAlias("Customer","customer", JoinType.RightOuterJoin) 
    .CreateAlias("Coordinator", "Coordinator", NHibernate.SqlCommand.JoinType.InnerJoin); 

if (!string.IsNullOrEmpty(custName)) 
{ 
    criteria.Add(Expression.Like("customer.Name", custName, MatchMode.Start)); 
} 
if (!string.IsNullOrEmpty(projectName)) 
{ 
    criteria.Add(Expression.Like("Name", projectName, MatchMode.Start)); 
} 

criteria.SetProjection(Projection.List() 
    .Add(Projections.Property("Id"), "ProjectId") 
    .Add(Projections.Property("Name"), "ProjectName") 
    .Add(Projections.Property("customer.Id"), "CustomerId") 
    .Add(Projections.Property("customer.Name"), "CustomerName")); 

projectList = criteria 
    .SetTransforer(Transformers.AliasToBean<SearchResult>()) 
    .List<Project>(); 
+0

답해 주셔서 감사합니다. NH가 null 프로젝트로 무엇을해야하는지 알 수 있도록 값을 어떤 객체에 투영하는 방법을 알려줄 수 있습니까? 이것은 많은 도움이 될 것입니다. – Amogh

+0

코드를 추가했습니다. 이제는 항상 유효한 객체를 다시 얻습니다. ProjectId와 ProjectName이 비어있을 수도 있습니다. – Firo

+0

ProjectId, ProjectName, CustomerName, CustomerId와 같은 별도의 속성을 가져야합니다. 프로젝트와 고객을 대상으로 삼을 수는 없습니까? – Amogh