1

NHibernate 4를 사용하여 SQL 쿼리를 처리했습니다.NHibernate - 제한이있는 조인 된 테이블에서 QueryOver를 사용하는 방법

다 대다 관계가있는 2 개의 테이블 (클라이언트 및 기술)이 있으므로 ClientTechnology라는 접합 테이블을 만들었습니다.

사용할 수있는 모든 기술 (사용자 지정이 아닌)과 해당 클라이언트에 속한 모든 기술을 검색하려고합니다. 클라이언트 테이블에 대한

declare @clientId int = 1 

     select * from 
     [dbo].[Technology] t 
     where t.IsCustom = 0 
     union 
     select t.* from 
     [dbo].[Technology] t 
     join [dbo].[ClientTechnology] ct 
     on ct.TechnologyId = t.Id 
     where t.IsCustom = 1 and ct.ClientId = @clientId 

내 유창함 매핑은 다음과 같습니다 : 기술 테이블에 대한

public ClientMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name).Not.Nullable(); 
    } 

은 다음과 같습니다

public TechnologyMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name).Not.Nullable(); 
     Map(x => x.IsCustom).Not.Nullable(); 

     HasMany(x => x.ClientTechnologies) 
      .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore) 
      .Table("ClientTechnology") 
      .KeyColumn("TechnologyId"); 
    } 

마지막으로 접합 테이블 SQL에서

이 문입니다 고객 기술 :

public ClientTechnologyMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Alias).Not.Nullable(); 
     Map(x => x.IsDeleted).Not.Nullable(); 

     References<Client>(x => x.Client, "ClientId"); 
     References<Technology>(x => x.Technology, "TechnologyId"); 
    } 

저는 이것을 달성하기위한 다른 옵션을 열었습니다. 내가 가진 가정 사용할 수 내가 요구 사항 IsCustom = 거짓 일치하고 이 IsCustom = 사실과 "제공된 요구 사항에 맞는 기술의 목록을 검색 기술의 첫 번째 목록을 검색 할 수있는 클라이언트 객체 (클라이언트 ID)

: 클라이언트는

은 내가 globalTechnologies를 검색하기 위해 다음과 같은 노력했다 (클라이언트 인스턴스를 제공) 기술의 열거를 반환해야하는 방법 public IEnumerable<Technology> GetTechnologies(Client client) 내에서이 사용자 정의 기술 "

의 소유자 내가 접합 테이블에 액세스하는 방법을 모른다

Technology technology = null; 
     ClientTechnology clientTechnology = null; 
     var customTechnologies = _session.QueryOver<Technology>(() => technology) 
      .JoinAlias(() => technology.ClientTechnologies,() => clientTechnology) 
      .WhereNot(x => x.IsDeleted) 
      .Where(x => x.IsCustom) 
      .Where(clientTechnology.Client == client) //this doesn't compile 
      .List(); 

하지만 은 (가입) 제한을 적용하기 위하여 :

var globalTechnologies = _session.QueryOver<Technology>() 
      .WhereNot(x => x.IsDeleted) 
      .WhereNot(x => x.IsCustom) 
      .List(); 

그리고 소유자 customTechnologies에 대한 다음은 클라이언트입니다.

도움을 주시면 감사하겠습니다. 고맙습니다. 귀하의 경우에는

답변

1

는, 유일한 문제는 당신이 .Where()의 내부 표현을 제공하지 않는 것을, 그래서이 작업을 수행해야합니다

// instead of this 
// .Where(clientTechnology.Client == client) //this doesn't compile 
// use this 
.Where(() => clientTechnology.Client == client) 

하지만 난 멀리 갈 것입니다. 우리는

  1. 클라이언트에 속하는 경우에만 이러한 Techonology.Id를 반환하는 하위 쿼리를 creat에 할 수 있어야한다.
  2. 우리는 또한 사용하거나하고있는 사람이 선택한 것 중 하나 개의 쿼리 수 있습니다 :
      IsCustom하지
    • 또는
    • 가 클라이언트에 속하는 마십시오을 하위 쿼리를 만드는 방법

당신 여기에서 볼 수 있습니다

그리고 예와 OR

+1

우수! 그건 내가 잃어버린 조각 이었어. 그것은 훌륭하게 작동했습니다. 고맙습니다. 매우 완전한 대답입니다. 보다 효율적으로 귀하의 제안을 조사하겠습니다. – iberodev

관련 문제