2012-10-10 3 views
1

둘 다 잘 수행되는 두 가지 쿼리를 만들었지 만 이들을 결합하는 방법을 이해하는 데 정말로 애 쓰고 있습니다. 가장 큰 문제는 두 가지 구문을 사용하여 쿼리를 작성했지만 "SQL-esque"마크 업을 사용하지 않고 첫 번째 쿼리를 표현하는 방법을 잘 모르겠습니다. 첫 번째 쿼리와 두 번째 쿼리에 대한 NHibernate에 마크 업에 대한 자세한 구문을 사용결과를 교차하는 두 NHibernate 쿼리를 결합하기 위해 애 쓰고 있습니다.

  • : 당신이 볼 수 있듯이

    List<Task> tasksFromQueue = NHibernateSession.CreateQuery(
        "Select t from Task t, QueueLocation q where q.Queue.ID = :queueID and (t.SiteID = q.ComponentID or t.OriginalSiteID = q.ComponentID)") 
        .SetParameter("queueID", queueID).List<Task>().ToList(); 
    
    List<Task> tasksFromWorkflow = NHibernateSession 
        .CreateCriteria(typeof(Task), "Task") 
        .CreateCriteria("Task.Order", "Order") 
        .CreateAlias("Task.TaskDevice", "TaskDevice").List<Task>(); 
    
    IEnumerable<Task> tasks = tasksFromWorkflow.Intersect(tasksFromQueue); 
    

    나는 두 가지 문제가 있습니다.

  • DB를 두 번 누른 다음 결과를 교차시킵니다.

tasksFromWorkflow 쿼리는 실제로 위에서 설명한 것보다 훨씬 복잡합니다. 전체 쿼리 click here.을보고 싶다면 여분의 코드가 내 문제를 실제로 변경했는지 확신 할 수 없으므로 문제를 설명하면서 가능한 한 짧게 바로 표시된 코드 조각을 유지하기로 결정했습니다.

나는 그 NHibernate doesn't support intersection을 읽었는데, 아마도 매우 복잡하게되지 않고 하나의 쿼리에서 성취 할 수 없을까?

답변

1

나는이 얼마나 성능이 좋은 잘 모릅니다하지만 tasksFromQueue에 대한 분리 기준에 대한 코드를 정리

var tasksFromQueue = DetachedCriteria.For<Task>() 
      .Add(Restrictions.Or(
       Subqueries.In("SiteID", DetachedCriteria.For<QueueLocation>().Add(Restrictions.Eq("Queue.ID", queueID)).SetProjection(Projections.Property("ComponentID"))), 
       Subqueries.In("OriginalSiteID", DetachedCriteria.For<QueueLocation>().Add(Restrictions.Eq("Queue.ID", queueID)).SetProjection(Projections.Property("ComponentID"))))) 
      .SetProjection(Projections.Id()); 

    "Select t from Task t, QueueLocation q where q.Queue.ID = :queueID and (t.SiteID = q.ComponentID or t.OriginalSiteID = q.ComponentID)") 
    .SetParameter("queueID", queueID).List<Task>().ToList(); 

var tasksFromWorkflow = DetachedCriteria.For<Task>() 
    .CreateAlias("Order", "order") 
    .CreateAlias("TaskDevice", "device") 
    .Add(<restrictions>) 
    .SetProjection(Projections.Id()); 

var results = NHibernateSession.CreateCriteria<Task>() 
    .Add(Subqueries.In("Id", tasksFromQueue)) 
    .Add(Subqueries.In("Id", tasksFromWorkflow)) 
    .List<Task>(); 
+0

생각은 명확해야한다,하지만 난 그것을 실행하려고 할 때 그것을 밖으로 오류가 발생한. 그것은 분명히 내 원래 tasksFromQueue 쿼리에서 직접 번역 아니에요. 나는 나중에 그것을 가지고 놀려고 노력할 것이다. –

+0

실행하면 쿼리를 게시 할 수 있습니까? 나는 당신과 같은 유스 케이스를 가진 다른 사람들이있을 것이라고 확신한다. – Firo

관련 문제