2009-06-26 2 views
0

기준 API를 사용하여 값 목록으로 필터링하려고합니다. 나는 이것이 가능하지 않다고 의심한다, 나는 단지 여기에 확신하도록 요구하고있다.NHibernate : 조건을 사용하여 값 목록에서 필터링 쿼리

class Entity 
{ 
    int id { get; set; } 
    IList<Guid> Guids { get; set; } 
} 

매핑 :

<class name="Entity"> 
    <id ...></id> 
    <bag name="Guids" table="Entity_Guids"> 
    <key column="Entity_FK"/> 
    <element column="Guid"/> 
    </bag> 
</class> 

내가 GUID 목록을 (실제로이 다른 하위 쿼리입니다)이 가정 하였다. 최소한 하나의 guid가 Guids 목록에있는 모든 엔터티를 필터링하려고합니다.

SQL은 다음과 같을 것이다 : 기준 API와

SELECT * 
FROM Entity e 
    inner join Entity_Guids eg 
    on e.id = eg.Entity_FK 
WHERE 
    eg.Guid in (subquery) 

이 불가능할 것으로 보인다.

ICriteria query = session 
    .CreateCriteria(typeof(Entity), "e") 
    .Add(Subqueries.In("e.Guids", subquery)) 

예외를 throw합니다.

+0

제외 : 당신의 GUID를 해당 속성 (값 속성은 실제 GUID를 포함)와 기관이었고, 양방향 관계가 있다면 당신은 아마 계속이 작업을 수행 할 수

? – MatthieuGD

+0

하위 쿼리가 분리 된 조건입니까? – MatthieuGD

+0

예, 하위 쿼리는 DetachedCriteria입니다. 단, 'key'인수는 null이 아니어야합니다. 사전에 액세스 할 때 예외 인 것처럼 보이며 많은 것을 의미하지는 않습니다. –

답변

1

하위 쿼리에 전달 된 e.Guids 속성이 단일 값이 아니기 때문에 쿼리가 작동하지 않습니다. 이 방법을 사용하면 실제로 교차를 수행하고 교차가 비어 있지 않은지 확인하려고합니다. 불행히도 Linq를 사용하여이 작업을 수행 할 수는 있지만 기준 API에는 존재하지 않습니다.

var subquery2 = DetachedCriteria.For<GuidEntity>() 
    .Add(Subqueries.In("Value", subquery)) 
    .SetProjection("Entity_FK"); 

ICriteria query = session.CreateCriteria(typeof (Entity)) 
    .Add(Subqueries.In("Id", subquery2)); 
+0

올바른 동작을 위해 "Id"를 테이블 열로 사용하는 Subqueries.PropertyIn() 메서드를 사용해야한다고 생각합니다 (예 : select ...). Subqueries.In()은 "Id"를 상수 (예 : 'Id'in (select ...))로 확인합니다. –