문제

기준 API를 사용하여 값 목록으로 필터링하려고합니다. 나는 이것이 불가능하다고 생각한다. 나는 단지 여기서 확신하도록 요구한다.

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>

안내 목록이 있다고 가정합니다 (실제로는 또 다른 하위 퀘스트입니다). 적어도 하나의 안내서가 안내 목록에있는 모든 엔티티를 필터링하고 싶습니다.

SQL은 다음과 같습니다.

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

기준 API를 사용하면 불가능한 것 같습니다.

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

예외를 던집니다.

도움이 되었습니까?

해결책

e.guids 속성이 하위 퀘스트에 전달 된 E.Guids 속성은 단일 값이 아니기 때문에 쿼리가 작동하지 않습니다. 이런 식으로 그렇게하려면 실제로 교차로를 수행하고 교차로가 비어 있지 않은지 확인하려고합니다. 불행히도 LINQ 로이 작업을 수행 할 수는 있지만 불행히도 API에 존재하지 않습니다.

귀하의 안내서가 적절한 속성을 가진 엔티티 (값 속성에는 실제 GUID가 포함되어 있음)이고 양방향 관계가있는 경우에도 여전히이 작업을 수행 할 수 있습니다.

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

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top