2011-04-20 3 views
1

NHibernate를 처음 사용하고 NHibernate의 조건 엔진을 사용하여 일부 SQL을 표현하는 가장 좋은 방법을 찾지 못했습니다. 여기 개체 모델의 기본 묘사는 다음과 같습니다NHibernate 기준을 사용하여이 쿼리를 만드는 방법

public class Project : EntityBase<Project> 
{ 
    // Properties for a project 
    public virtual Company OwnerCompany { get; set; } 
    public virtual IList<UserAssignment> UserAssignments { get; set; } 
} 

public class Company : EntityBase<Company> 
{ 
    // Properties for a company 
} 

public class User : EntityBase<User> 
{ 
    // Properties for a user 
    public virtual Company Company { get; set; } 
} 

public class UserAssignment : EntityBase<UserAssignment> 
{ 
    // Properties for an assignment 
    public virtual User User { get; set; } 
} 

당신은 기본 테이블 모양을 클래스에서 추론 할 수있다, 모든 NH 물건이 EntityBase 추상 클래스입니다.

본질적으로 특정 회사가 소유하거나 해당 회사의 누군가를 위해 UserAssignments를 소유 한 모든 프로젝트를 가져 오려고합니다.는 여기에 내가 SQL에서 할 수있는 방법은 다음과 같습니다 나는 DetachedCriteria를 사용하고

select P.* 
from Project P 
where P.OwnerCompany_Id = @CompanyId 
    or P.Id in (
     select Project_Id 
     from UserAssignment UA 
      join User U on UA.User_Id = U.Id 
     where U.Company_Id = @CompanyId 
    ) 

, 그리고 난 그냥 회사, 훨씬 덜 과제 모두와 소유자에게 UserAssignment의 사용자를 일치하는 동작하지 않습니다 . 나는이 시도하는 경우 :

var criteria = DetachedCriteria 
       .For<Project>() 
       .CreateCriteria("UserAssignments") 
        .Add(Expression.Eq("User.Company.Id", requestingUser.Company.Id)); 

나는 오류가 말을 얻을 "속성을 확인할 수 없습니다 :. TestProject.Domain.UserAssignment의 User.Company.Id을"

아무도 도와 줄 수 있습니까?

답변

0

: 당신은 명시 적으로 별칭을 지정해야합니다 프로젝트 외에 몇 가지 다른 것들에 대해서,하지만 그것없이 Criteria를 사용하여 join을 강제하는 방법을 알 수는 없었다. 나는 SQL 표현식이나 HQL을 사용하고 싶지 않았다.

조쉬

1

기준을 사용할 때 식을 사용하여 탐색 할 수 없습니다.

var userSubquery = DetachedCriteria.For<UserAssignment>() 
    .SetProjection(Projections.Property("Project")) // I had to put this reference property in the UserAssignment 
    .CreateCriteria("User") 
    .CreateCriteria("Company") 
    .Add(Restrictions.Eq("Id", requestingUser.Company.Id)); 

var projectCriteria = DetachedCriteria.For<Project>() 
    .Add(Restrictions.Or(
     Restrictions.Eq("OwnerCompany.Id", requestingUser.Company.Id), 
     Subqueries.PropertyIn("Id", userSubquery))); 

내가 그 객체에 적용 할 수 있기 때문에 UserAssignment 객체에 Project 속성을 추가하지 싶었 :이 같은 하위 쿼리를 사용하지 결국

.CreateAlias("User", "User") 
.Add(Expression.Eq("User.Company", requestingUser.Company));