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에 대한 다음은 클라이언트입니다.
도움을 주시면 감사하겠습니다. 고맙습니다. 귀하의 경우에는
우수! 그건 내가 잃어버린 조각 이었어. 그것은 훌륭하게 작동했습니다. 고맙습니다. 매우 완전한 대답입니다. 보다 효율적으로 귀하의 제안을 조사하겠습니다. – iberodev