2012-10-10 46 views
1

我已經制作了兩個查詢,這兩個查詢都可以正常工作,但我真的很難理解如何組合它們。我認爲我最大的問題是,我對查詢使用了兩種不同的語法,但我不確定如何在不使用「SQL-esque」標記的情況下表達我的第一個查詢。努力結合兩個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); 

正如你可以看到我有兩個問題:

  • 使用詳細的語法爲第一查詢和NHibernate的加價第二查詢。
  • 敲擊DB兩次,然後與結果相交。

tasksFromWorkflow查詢實際上比上面看到的要複雜得多。如果您希望查看整個查詢click here.我不確定額外的代碼是否真的改變了我的問題 - 所以我決定儘可能縮短顯示的代碼片段,同時仍然解釋問題。

我讀過NHibernate doesn't support intersection,所以也許不可能在一個查詢中實現而不會變得非常複雜?

回答

1

我不知道如何表現之,這將是但這個想法應該很清楚

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分離的標準代碼,但它出錯了,當我試圖運行它。這顯然不是從我的原始任務FromQueue查詢的直接翻譯。我會盡量在今天晚些時候再玩一下。 –

+0

你可以發佈查詢,如果它運行?我相信會有其他人有你的用例 – Firo