2012-09-11 2 views
0

하나 개 NHibernate에 쿼리이 아닌 직접 관련 테이블에 대한 작업.내가 NHibernate에 새로운 오전과 내가 무엇을 해달라고 부탁하는 것은 의미가 확실하지 않다

public IEnumerable<Order> GetByQueue(OrderStatus orderStatus, Queue queue) 
{ 
    var criteria = NHibernateSession.CreateCriteria(typeof (TaskDevice), "TaskDevice"); 

    //Pull up all Tasks where a Task's TaskDevice's SourceSiteID or DestinationSiteID are represented in a Queue's QueueLocations. 
    foreach(QueueLocation queueLocation in queue.QueueLocations) 
    { 
     criteria.Add(
       Expression.Disjunction() 
        .Add(Restrictions.Eq("OriginalLocationID", queueLocation.ComponentID)) 
        .Add(Restrictions.Eq("LocationID", queueLocation.ComponentID)) 
      ); 
    } 

    //Get a hold on all the Tasks returned from TaskDevices. 
    List<Task> tasks = criteria.List<TaskDevice>().Select(taskDevice => taskDevice.Task).ToList(); 

    //Return all Orders of the given Tasks whose OrderStatus matched the provided orderStatus. 
    return tasks.Where(task => task.Order.OrderStatus == orderStatus).Select(task => task.Order); 
} 

이 코드는 현재 큐 개체에 따라 달라집니다

는 내가 현재 가지고 몇 가지 코드를 다시 작성하려합니다. 이 코드를 변경하여 Queue 객체 대신 queueID가 제공되도록하고 싶습니다. QueueLocation 테이블에는 해당 열 중 하나에 대한 'QueueID'가 들어 있습니다.

즉, 데이터베이스의 QueueLocation에있는 다른 테이블과 상호 작용해야하며 제공된 QueueID와 일치하는 QueueID를 가진 QueueLocation을로드 한 다음 Queue 개체를 반복하지 않고 제한 사항을 추가 할 수 있습니다.

작업 대기열을 알고하지 않고 큐는 작업을 알고하지 않습니다. 그것들은 Queue가 Task의 OriginalLocationID 나 LocationID와 ComponentID가 일치하는 QueueLocation을 포함 할 수 있다는 사실에 의해 관련됩니다.

나는 내 최초 기준 선언을 변경하는 경우 : NHibernate에이 TaskDevice에 속성 QueueLocation을 찾을 수

var criteria = NHibernateSession 
    .CreateCriteria(typeof (TaskDevice), "TaskDevice") 
    .CreateCriteria("QueueLocation", "QueueLocation"); 

다음 예외가 생성됩니다 표시. 이것은 유효한 예외입니다. TaskDevice는 QueueLocation을 알지 못합니다.

나는 하나 개의 쿼리에 완전히 자 NHibernate를 통해 내 제한을 필터링 할 수 NHibernate에는 사용하여 두 개의 비 관련 테이블을로드하는 방법을 궁금해하고있다. 이것이 가능한가?

답변

1

기준 모델에 관련이없는 기관과 쿼리에 대한 좋은 API 아니다. 대신

사용 HQL.

관련 문제